【每日刷题】Day120
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
1. 413. 等差数列划分 - 力扣(LeetCode)
2. 978. 最长湍流子数组 - 力扣(LeetCode)
3. 15. 三数之和 - 力扣(LeetCode)
1. 413. 等差数列划分 - 力扣(LeetCode)
//思路:子数组动态规划问题。
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums)
{
int n = nums.size(),ans = 0;;
if(n<3) return 0;
vector<int> dp(n);
for(int i = 2;i<n;i++)
{
dp[i] = nums[i]-nums[i-1]==nums[i-1]-nums[i-2]?dp[i-1]+1:0;
ans+=dp[i];
}
return ans;
}
};
2. 978. 最长湍流子数组 - 力扣(LeetCode)
//思路:子数组动态规划问题。
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr)
{
int n = arr.size(),ans = 0;
if(n==1) return 1;
vector<int> dp(n);
dp[0] = 1;
if(arr[1]!=arr[0]) dp[1] = 2;
else dp[1] = 1;
if(n<3) return dp[n-1];
for(int i = 2;i<n;i++)
{
int ret1 = arr[i],ret2 = arr[i-1],ret3 = arr[i-2];
if((ret1-ret2>0&&ret2-ret3<0)||(ret1-ret2<0&&ret2-ret3>0)) dp[i] = dp[i-1]+1;
else if(ret1!=ret2) dp[i] = 2;
else dp[i] = 1;
}
for(int i = 0;i<n;i++) ans = ans>dp[i]?ans:dp[i];
return ans;
}
};
3. 15. 三数之和 - 力扣(LeetCode)
//思路:双指针。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
int n = nums.size();
int min = 0;//min初始固定在数组开头
vector<vector<int>> ans;
sort(nums.begin(),nums.end());
while(min<=n-3)
{
int left = min+1,right = n-1;
vector<int> tmp;
while(left<right)
{
if(nums[left]+nums[right]>-nums[min]) right--;//right过大
else if(nums[left]+nums[right]<-nums[min]) left++;//left过小
else
{
tmp = {nums[min],nums[left],nums[right]};
ans.push_back(tmp);//满足题意,记录三元组
left++;
right--;
while(left<right&&nums[left]==nums[left-1]) left++;//跳过重复的数字,避免重复三元组的出现。
}
}
min++;
while(min<=n-3&&nums[min]==nums[min-1]) min++;//同样是避免重复三元组的出现
}
return ans;
}
};