随想录训练营Day31 | 贪心 455.分发饼干, 376. 摆动序列, 53. 最大子序和
标签: LeetCode闯关记
455.分发饼干
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
for (int i = 0, start = 0; i < s.length && start < g.length; i++) {
if(s[i] >= g[start]){
start++;
count++;
}
}
return count;
}
}
time: 7 min
376. 摆动序列
思路: 找峰值 三种特殊情况
- diff 出现0,即平坡, 两种: ①单调坡上的平坡; ②上下坡中有平坡
- 只有两个不同的元素,那摆动序列也是2 代码中对于特殊情况的处理
//似懂非懂
class Solution {
public int wiggleMaxLength(int[] nums) {
int prediff = 0;//默认首个元素前面还有一个相同数值的元素
int curdiff = 0;//默认为0是因为反正之后都会变
int count = 1;//默认第一个元素为峰值并计入count
if(nums.length == 1){
return count;
}
for (int i = 0; i < nums.length - 1; i++) {//边界值也有讲究,还是不太懂
curdiff = nums[i + 1] - nums[i];
if(prediff <= 0 && curdiff > 0 || prediff >=0 && curdiff < 0){//在prediff上取等是因为考虑到1)平坡的情况②, 取最右边的元素
count++;
prediff = curdiff;
}
}
return count;
}
}
time: 1h
53. 最大子序和
思路: 局部最优--当前面的元素和sum < 0, 再加上sum就是拖累, 所以需要丢弃掉,使sum=0,再从后面的元素找最大子序列; 细节:
- result(用来记录连续子数组的最大和)依赖于sum的变化,即if(sum > result),result会更新数值;
- result具有一定独立性(这也是result的作用) : 考虑这种情况: sum 不断变小,但仍 > 0,此时子序列的和在变小,但是sum没有被丢弃掉,此时result的作用发挥出来了,即仍然在result处保存了之前的最大值;(这种情况就是,sum虽然成为拖累,但是还没丢弃)
class Solution {
public int maxSubArray(int[] nums) {
int result = Integer.MIN_VALUE;//(result用来记录连续子数组的最大和)
int sum = 0; //sum用于记录nums[i]之前的数组元素和, 一旦sum< 0,则抛弃掉,因为再加上只会拖累后面的元素
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if(sum > result){
result = sum;
}
if(sum < 0){
sum = 0;
}
}
return result;
}
}
time: 45min