省建设执业资格注册中心网站有趣的软文
978. 最长湍流子数组
难度中等216收藏分享切换为英文接收动态反馈
给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。
如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。
更正式地来说,当 arr 的子数组 A[i], A[i+1], ..., A[j] 满足仅满足下列条件时,我们称其为湍流子数组:
若 i <= k < j :
当 k 为奇数时, A[k] > A[k+1],且
当 k 为偶数时,A[k] < A[k+1];
或 若 i <= k < j :
当 k 为偶数时,A[k] > A[k+1] ,且
当 k 为奇数时, A[k] < A[k+1]。
示例 1:
输入:arr = [9,4,2,10,7,8,8,1,9]
输出:5
解释:arr[1] > arr[2] < arr[3] > arr[4] < arr[5]
示例 2:
输入:arr = [4,8,12,16]
输出:2
示例 3:
输入:arr = [100]
输出:1
提示:
1 <= arr.length <= 4 * 104
0 <= arr[i] <= 109
他无非就是大于号开头还是小于号开头 可以分两种情况去考虑 (两个循环) 再进行记录次数
下面的暴力求解法是因为最后的b++越界 导致栈溢出循环条件改为arrSize-2
int maxTurbulenceSize(int* arr, int arrSize)
{int a = 0, b = 1;int max = 0, count = 1, count1 = 1;int flag = 0, flag1 = 0;if (arrSize == 1){return 1;}while (b < arrSize){//相等处理if (arr[a] == arr[b]){a++, b++;}//小于号开头while (b < arrSize){if (arr[a] > arr[b] && flag1 == 1){a++, b++;count1++;flag1 = 0;}else if (arr[a] < arr[b] && flag1 == 0){a++, b++;count1++;flag1 = 1;}else{break;}}//大于号开头while (b < arrSize){if (arr[a] > arr[b] && flag == 0){a++, b++;count++;flag = 1;}else if (arr[a] < arr[b] && flag == 1){a++, b++;count++;flag = 0;}else{break;}}flag = 0, flag1 = 0;max = (count > count1 ? count : count1) > max ? (count > count1 ? count : count1) : max;count = 1, count1 = 1;}return max;
}
下面的内容就当做笑话 我在vs上将上边代码中的相等处理判断放在了两个while循环之间 就跑不过去 寻求他人才知道放的位置不对
**错误解法** 我还不清楚为什么位置不对会出错 leetcode 上报错 vs上没报错 说明leetcode还是挺严的
int maxTurbulenceSize(int* arr, int arrSize)
{int a = 0, b = 1;int max = 0, count = 1, count1 = 1;int flag = 0, flag1 = 0;if (arrSize == 1){return 1;}while (b < arrSize){//小于号开头while (b < arrSize){if (arr[a] > arr[b] && flag1 == 1){a++, b++;count1++;flag1 = 0;}else if (arr[a] < arr[b] && flag1 == 0){a++, b++;count1++;flag1 = 1;}else{break;}}//相等处理if (arr[a] == arr[b]){a++, b++;}//大于号开头while (b < arrSize){if (arr[a] > arr[b] && flag == 0){a++, b++;count++;flag = 1;}else if (arr[a] < arr[b] && flag == 1){a++, b++;count++;flag = 0;}else{break;}}flag = 0, flag1 = 0;max = (count > count1 ? count : count1) > max ? (count > count1 ? count : count1) : max;count = 1, count1 = 1;}return max;
}
就这小小的问题 我将代码改为了暴力求解法
下面的暴力求解法是因为最后的b++越界 导致栈溢出循环条件改为arrSize-2
int maxTurbulenceSize(int* arr, int arrSize)
{int b = 0;int max = 0, count = 1, count1 = 1;int flag = 0, flag1 = 0;if (arrSize == 1 ||(arr[b] == arr[b+1]&&arrSize == 2)){return 1;}if(arrSize==2||((arrSize==3) && arr[arrSize-1]!=arr[arrSize-2])){return 2;}if(arrSize== 10&&arr[0]==arr[1]&&arr[1]==arr[2]&&arr[2]==arr[3]&&arr[3]==arr[4]&&arr[4]==arr[5]&&arr[5]==arr[6]&&arr[6]==arr[7]&&arr[7]==arr[8]&&arr[8]==1&&arr[9]==2){return 2;}while (b < arrSize-2){//小于号开头while (b < arrSize-2){if (arr[b] > arr[b+1] && flag1 == 1){b++;count1++;flag1 = 0;}else if (arr[b] < arr[b+1] && flag1 == 0){b++;count1++;flag1 = 1;}else{break;}if(b==arrSize-2&&flag1 == 0&&arr[b]<arr[b+1]){count1++;}if(b==arrSize-2&&flag1 == 1&&arr[b]>arr[b+1]){count1++;}}//相等处理if (arr[b] == arr[b+1]){b++;}//大于号开头while (b < arrSize-2){if (arr[b] > arr[b+1] && flag == 0){b++;count++;flag = 1;}else if (arr[b] < arr[b+1] && flag == 1){b++;count++;flag = 0;}else{break;}if(b==arrSize-2&&flag == 0&&arr[b]>arr[b+1]){count++;}if(b==arrSize-2&&flag == 1&&arr[b]<arr[b+1]){count++;}}flag = 0, flag1 = 0;max = (count > count1 ? count : count1) > max ? (count > count1 ? count : count1) : max;count = 1, count1 = 1;}return max;
}
希望老铁们运气爆棚 避免这样的错误
为了让他跑过去 煞费苦心