题目1:455 分发饼干
题目链接: 455 分发饼干
题意
给孩子分发饼干,每个孩子最多只能有1块饼干
每个孩子i都有一个胃口值g[i] ,每块饼干j的尺寸是s[j] 如果s[j]>=g[i]可以将这个饼干分配给孩子i 孩子就会得到满足,尽可能多地满足孩子,输出最大值
局部最优:将大尺寸的饼干分配给大胃口的孩子,充分利用饼干
全局最优:满足数量多的孩子
代码
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
//排序
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int result = 0;
int index = s.size()-1;
//先遍历胃口
for(int i=g.size()-1;i>=0;i--){
if(index>=0 && s[index]>=g[i]){
index--;
result++;
}
}
return result;
}
};
- 时间复杂度:O(nlogn)
- 空间复杂度:O(1)
题目2:376 摆动序列
题目链接:376 摆动序列
题意
连续数字之间的差在正数和负数之间交替,这样的数字序列称为摆动序列 仅由1个元素或两个不等元素的序列也是摆动序列
子序列可以从原始序列中删除或不删除元素获得,其余元素保持原始顺序不变
返回整数数组中摆动序列最长子序列的长度
局部最优:删除单调坡中的元素,全局最优:最长摆动序列
不用真正删除数组中的元素(O(n)),直接计数长度即可
默认数组有一个摆动序列的长度
代码
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int result = 1;//计数序列的最右边
int prediff = 0;
int curdiff = 0;
for(int i=0;i<nums.size()-1;i++){
curdiff = nums[i+1] - nums[i];
if((prediff>=0 && curdiff<0) || (prediff<=0 && curdiff>0)){
result++;
prediff = curdiff;
}
}
return result;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)
题目3:53 最大子序和
题目链接:53 最大子序和
题意
找出整数数组nums中具有最大和的连续子数组,返回最大和
连续和是负数,加上后面的数只会拖累后面的数,让后面的数更小,所以从后面的数重新计算连续和;只要连续和是正数,该连续和加上后面的数,就会增大后面的数
局部最优:连续和为负数,立刻抛去连续和,以下一个数为起点计算连续和
全局最优:找到最大连续和
贪心算法
代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT_MIN;
int count = 0;
for(int i=0;i<nums.size();i++){
//计算连续和
count += nums[i];
if(count>result) result = count;
if(count<0) count = 0;
}
return result;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)