Use this to learn the idea, then write your own version.
123 45class Solution {6public:7 int longestAlternating(vector<int>& nums) {8 int result = 1, up1 = 1, up0 = 1, down1 = 1, down0 = 1;9 for (int i = 0; i + 1 < size(nums); ++i) {10 if (nums[i] < nums[i + 1]) {11 tie(up1, up0, down1, down0) = tuple(down1 + 1, down0 + 1, down0, 1);12 } else if (nums[i] > nums[i + 1]) {13 tie(up1, up0, down1, down0) = tuple(up0, 1, up1 + 1, up0 + 1);14 } else {15 tie(up1, up0, down1, down0) = tuple(up0, 1, down0, 1);16 }17 result = max({result, up1, down1});18 }19 return result;20 }21};22 23242526class Solution2 {27public:28 int longestAlternating(vector<int>& nums) {29 int result = 1, up0 = 1, down0 = 1;30 int up1 = 0, down1 = 0;31 for (int i = 0; i + 1 < size(nums); ++i) {32 if (nums[i] < nums[i + 1]) {33 tie(up1, up0, down1, down0) = tuple(down1 + 1, down0 + 1, down0, 1);34 } else if (nums[i] > nums[i + 1]) {35 tie(up1, up0, down1, down0) = tuple(up0, 1, up1 + 1, up0 + 1);36 } else {37 tie(up1, up0, down1, down0) = tuple(up0, 1, down0, 1);38 }39 result = max({result, up1, down1, up0, down0});40 }41 return result;42 }43};44 45464748class Solution3 {49public:50 int longestAlternating(vector<int>& nums) {51 const auto& cmp = [](int a, int b) {52 return (a > b) - (a < b);53 };54 55 vector<int> left(size(nums), 1);56 for (int i = 1; i < size(nums); ++i) {57 const auto& diff = cmp(nums[i - 1], nums[i]);58 if (!diff) {59 continue;60 }61 left[i] = (i - 2 >= 0 && cmp(nums[i - 2], nums[i - 1]) == -diff) ? left[i - 1] + 1 : 2;62 }63 vector<int> right(size(nums), 1);64 for (int i = size(nums) - 2; i >= 0; --i) {65 const auto& diff = cmp(nums[i], nums[i + 1]);66 if (!diff) {67 continue;68 }69 right[i] = (i + 2 < size(nums) && cmp(nums[i + 1], nums[i + 2]) == -diff) ? right[i + 1] + 1 : 2;70 }71 int result = ranges::max(left);72 for (int i = 1; i + 1 < size(nums); ++i) {73 const auto& diff = cmp(nums[i - 1], nums[i + 1]);74 if (!diff) {75 continue;76 }77 const auto& l = (i - 2 >= 0 && cmp(nums[i - 2], nums[i - 1]) == -diff) ? left[i - 1] : 1;78 const auto& r = (i + 2 < size(nums) && cmp(nums[i + 1], nums[i + 2]) == -diff) ? right[i + 1] : 1;79 result = max(result, l + r);80 }81 return result;82 }83};84