22. 413 . 等差数列划分
题目:
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
- 例如,
[1,3,5,7,9]
、[7,7,7,7]
和[3,-1,-5,-9]
都是等差数列。给你一个整数数组
nums
,返回数组nums
中所有为等差数组的 子数组 个数。子数组 是数组中的一个连续序列。
题目链接
文字分析
代码
class Solution { public: int numberOfArithmeticSlices(vector<int>& nums) { int sum = 0; int n = nums.size(); if(n == 1 || n == 2) { return 0; } vector<int> dp(n); dp[0] = 0; dp[1] = 0; for(int i = 2;i < n;i++) { if(nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]) { dp[i] = dp[i - 1] + 1; } else { dp[i] = 0; } sum += dp[i]; } return sum; } };
23. 413 . 最长湍流子数组
题目:
给定一个整数数组
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]
。
题目链接
文字分析
代码
class Solution { public: int maxTurbulenceSize(vector<int>& arr) { int n = arr.size(); if(n == 1) { return 1; } vector<int> dp(n); dp[0] = 1; if(arr[0] == arr[1]) { dp[1] = 1; } else { dp[1] = 2; } int Max = dp[1]; for(int i = 2;i < n;i++) { if( (arr[i - 1] < arr[i] && arr[i - 1] < arr[i - 2]) || (arr[i - 1] > arr[i] && arr[i - 1] > arr[i - 2]) ) { dp[i] = dp[i - 1] + 1; } else { if(arr[i] == arr[i - 1]) { dp[i] = 1; } else { dp[i] = 2; } } Max = max(Max,dp[i]); } return Max; } };
24. 139 . 单词拆分
题目:
给你一个字符串
s
和一个字符串列表wordDict
作为字典。如果可以利用字典中出现的一个或多个单词拼接出s
则返回true
。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
题目链接
文字分析
代码
class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { unordered_set<string> hash; for(auto i: wordDict) { hash.insert(i); } int n = s.size(); string _s = ' ' + s; vector<bool>dp(n + 1); dp[0] = true; for(int i = 1;i <= n;i++) { for(int j = i; j >= 1;j--) { if(dp[j - 1] && hash.count(_s.substr(j,i - j + 1))) { dp[i] = true; break; } else { dp[i] = false; } } } return dp[n]; } };