978. 最长湍流子数组
- 原题链接:
- 完成情况:
- 解题思路(一):滑动窗口
- 参考代码:
- 解题思路(二):动态递归
- 参考代码:
- 针对(二)进行优化:
原题链接:
978. 最长湍流子数组
https://leetcode.cn/problems/longest-turbulent-subarray/description/
完成情况:
解题思路(一):滑动窗口
参考代码:
package 西湖算法题解___中等题;
public class __978最长湍流子数组__滑动窗口 {
//滑动窗口的思路,就是一直不断向外扩张,进行判断
/**
题目解释:
即遍历找满足条件的最长连续子数组
* @param arr
* @return
*/
public int maxTurbulenceSize(int[] arr) {
//1 <= arr.length <= 4 * 104
//0 <= arr[i] <= 109
if (arr.length <1){
return 0;
}
int res = 1;
int left = 0,right = 0;
while (right < arr.length-1){
if (left == right){
if (arr[left] == arr[left + 1]){ //来看left,right是否应该移动
left++;
}
right++;
}else {
if (arr[right - 1] < arr[right] && arr[right] > arr[right+1]){
right++;
}else if (arr[right - 1] > arr[right] && arr[right] < arr[right+1]){
right++;
}else {
left = right;
}
}
res = Math.max(res,right - left + 1);
}
return res;
}
}
解题思路(二):动态递归
参考代码:
package 西湖算法题解___中等题;
public class __978最长湍流子数组__滑动窗口01 {
public int maxTurbulenceSize(int[] arr) {
if (arr.length <1){
return 0;
}
int res = 1;
int dp_maxTurbulenceSize [][] = new int[arr.length][2];
dp_maxTurbulenceSize[0][0] = dp_maxTurbulenceSize[0][1] = 1;
dp_maxTurbulenceSize[0][0] = dp_maxTurbulenceSize[0][1] = 1;
for (int i=1;i< arr.length;i++){
dp_maxTurbulenceSize[i][0] = dp_maxTurbulenceSize[i][1] = 1;
if (arr[i-1] > arr[i]){
dp_maxTurbulenceSize[i][0] = dp_maxTurbulenceSize[i-1][1] + 1;
}else if (arr[i-1] < arr[i]){
dp_maxTurbulenceSize[i][1] = dp_maxTurbulenceSize[i-1][0] + 1;
}
}
for (int i=0;i<arr.length;i++){
res = Math.max(res,dp_maxTurbulenceSize[i][0]);
res = Math.max(res,dp_maxTurbulenceSize[i][1]);
}
return res;
}
}
针对(二)进行优化:
package 西湖算法题解___中等题;
public class __978最长湍流子数组__滑动窗口02优化 {
public int maxTurbulenceSize(int[] arr) {
if (arr.length <1){
return 0;
}
int res = 1;
int dp0 = 1,dp1 = 1;
for (int i=1;i< arr.length;i++){
if (arr[i-1] > arr[i]){
dp0 = dp1 + 1;
dp1 = 1;
} else if (arr[i-1] < arr[i]) {
dp1 = dp0 + 1;
dp0 = 1;
}else {
dp0 = 1;
dp1 = 1;
}
res = Math.max(res,dp0);
res = Math.max(res,dp1);
}
return res;
}
}