Another from the archives. I think this is a nice introduction to a more “stateful” complicated loop. A productive approach was to break it into cases. I think this is a nice introduction to state machines.
class Solution {
public:
enum class dir {
UNKNOWN,
INCREASING,
DECREASING
};
bool isMonotonic(vector<int>& nums) {
auto state = dir::UNKNOWN;
for (int i = 1; i < nums.size(); i++) {
switch (state) {
case dir::UNKNOWN:
if (nums[i-1] < nums[i]) {
state = dir::INCREASING;
}
else if (nums[i-1] > nums[i]) {
state = dir::DECREASING;
}
break;
case dir::INCREASING:
if (nums[i-1] > nums[i]) {
return false;
}
break;
case dir::DECREASING:
if (nums[i-1] < nums[i]) {
return false;
}
break;
}
}
return true;
}
};