理论基础
455.分发饼干
题目
code
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int index = s.size() - 1; // 饼干数组的下标
int count = 0;
for(int i = g.size()-1;i>=0;i--) //遍历孩子的胃口
{
if(index>=0 && s[index]>=g[i])//匹配对应的饼干
{
index--;
count++;
}
}
return count;
}
};
复杂度
376.摆动序列
题目
code
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if (nums.size() <= 1) return nums.size();
int prediff = 0;
int curdiff = 0;
int result = 1;
for(int i = 0; i < nums.size()-1; i++)
{
curdiff = nums[i+1] - nums[i];
//出现峰值
if((prediff>=0 && curdiff<0)||(prediff<=0 && curdiff>0)) //删除左侧相同元素,因此prediff可以为0
{
result++;
prediff = curdiff; // 注意这里,只在摆动变化的时候更新prediff
}
}
return result;
}
};
复杂度
53.最大子序和
题目
code
1.贪心
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum_max = INT32_MIN;
int count = 0;
for (int i = 0; i<nums.size();i++)
{
count += nums[i];
if(count>sum_max)
{
sum_max = count;
}
if(count<=0)
{
count = 0;
}
}
return sum_max;
}
};
2.动态规划
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.size() == 0) return 0;
vector<int> dp(nums.size(), 0); // dp[i]表示包括i之前的最大连续子序列和
dp[0] = nums[0];
int result = dp[0];
for(int i = 1;i<nums.size();i++)
{
dp[i] = max(dp[i-1]+nums[i],nums[i]);
if(dp[i]>result)
{
result = dp[i];
}
}
return result;
}
};