当 A 的子数组 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]。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
返回 A 的最大湍流子数组的长度。
示例 1:
输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])
示例 2:
输入:[4,8,12,16]
输出:2
示例 3:
输入:[100]
输出:1
提示:
1 <= A.length <= 40000
0 <= A[i] <= 10^9
这个题用动态规划,比较好想,适合动态规划入门练习。
从大一开始学算法,动归一直就是个坑,打算这阵好好刷一刷。
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr) {
int dp[40000+10];
int flag = 0;
int length = arr.size();
int maxn = 1;
dp[0] = 1;
for(vector<int>::size_type i=1;i!=arr.size();i++) {
int comp = 0;
if(arr[i] > arr[i-1])
{
comp = 1;
}
else if(arr[i] < arr[i-1])
{
comp = 2;
}
else
{
comp = 0;
}
if(comp!=flag && comp!=0) {
dp[i] = dp[i-1]+1;
}
else if(comp == 0) {
dp[i] = 1;
}
else {
dp[i] = 2;
}
flag = comp;
if(dp[i] > maxn) maxn = dp[i];
}
return maxn;
}
};
看了下题解,往前判断两个元素是我一开始的思路,贴份代码吸收一下吧。动归还是要多练。
class Solution:
def maxTurbulenceSize(self, A: List[int]) -> int:
n = len(A)
if n < 2:
return n
dp = [1] * n
dp[1] = 1 if A[0] == A[1] else 2
res = dp[1] # 结果至少为dp[1]
for i in range(2, n):
if A[i] != A[i - 1]:
dp[i] = 2 # 至少[A[i-1], A[i]]是湍流子数组
if A[i - 2] > A[i - 1] < A[i] or A[i - 2] < A[i - 1] > A[i]:
dp[i] = dp[i - 1] + 1
res = max(res, dp[i])
# dp[i]初始值就是1, 下面不需要了
# else:
# dp[i] = 1
return res