LeetCode 978. 最长湍流子数组
哎。。。滑动窗口的题目,自己猜到了要用滑动窗口,但是没做出来;
这道题目用滑动窗口和DP都可以;
滑动窗口:
如果采用滑动窗口的记录前一位标志位,right和right-1比较,会丢失一部分序列;
例如:9,4,2,10,7,8;
湍流数列应该为:4,2,10,7,8;
但是如果采用我的滑动窗口比较会变为:2,10,7,8;
原因是当记录了9,4,2之后,会从2重新开始计算湍流,而不是从4开始;
附错误代码:
int maxTurbulenceSize(vector<int>& arr) { int len = arr.size(); if (len == 1) return 1; int maxn = 1; int cnt = 0; int left = 0, right = 1; int flag = true;//true代表i<j,false代表i>j; for (; right < len;right++) { if (arr[right] == arr[left]) { left=right; cnt = max(maxn, cnt); continue; } if (right == 1) { //特殊条件,如果右指针在第二位; if (arr[left] < arr[right]) flag = true; else flag = false; maxn ++; continue; }else { if (right == left + 1) { //特殊条件,如果右指针在第二位; if (arr[left] < arr[right]) flag = true; else flag = false; maxn++; continue; } if ((!flag & arr[right] > arr[right - 1])||(flag & arr[right] < arr[right - 1])) { maxn = right - left + 1; flag = !flag; } else { left = right; cnt = max(maxn, cnt); maxn = 1; } } } return cnt; }
如果采用三位比较,这样对于9,4,2,10,7,8;
对于判断4的时候,如果判断
当4不满足的时候,判断可以从4重新判断,而不会从2开始判断,更简单一点;
DP解法:
使用dp,维护两个数组来进行遍历;
所以,状态转移方程为:
int maxTurbulenceSize(vector<int>& arr) { int n = arr.size(); if (n < 2) return n; vector<int>up(n); vector<int>down(n); int res = 1; up[0] = down[0] = 1; for (int i = 1; i < n; i++) { if (arr[i - 1] < arr[i]) { up[i] = down[i - 1] + 1; down[i] = 1; } else if (arr[i - 1] > arr[i]) { down[i] = up[i - 1] + 1; up[i] = 1; } else { up[i] = 1; down[i] = 1; } res = max(res, max(up[i], down[i])); } return res; }