学习目标:
贪心算法中的贪心指的是局部最优。
贪心算法就是直觉可以接受就行,不要求严格的数学证明。不合适的条件设置用反证法证明不适用就行。
贪心算法相关的题目做的很不舒服,可能是因为我不贪心吧,更可能是因为没有任何的规律性;总是感觉一知半解的,就很迷茫。
60天训练营打卡计划!
学习内容:
455.分发饼干
- 最外层循环一定是胃口,因为如果胃口太大会一直递减到合适的胃口
就有些奇怪,但是只能强迫自己接受。
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
// 由胃口找饼干
int index = s.length - 1;
int res = 0;
// 最外层循环一定是胃口,因为如果胃口太大会一直递减到合适的胃口
// 不能严格的要求证明,只要能举出最外层是饼干的错误情况就可以。
for(int i = g.length - 1; i >= 0; i--){
if(index >= 0 && g[i] <= s[index]){
res++;
index--;
}
}
return res;
}
}
376. 摆动序列
- 不知道该总结什么规律
- 勉强可以归类到双指针里。
class Solution {
public int wiggleMaxLength(int[] nums) {
int size = nums.length;
// 我更喜欢把特殊的情况写到上面
if(size == 1 || (size == 2 && (nums[0] == nums[1]))) return 1;
if(size == 2 && (nums[0] != nums[1])) return 2;
int prediff = nums[1] - nums[0];
int curdiff = 0;
int res = prediff == 0 ? 1 : 2;
// 也可以视为双指针法,curdiff和prediff
// 当且仅当出现转折点时,才更新prediff
for(int i = 1; i < size - 1; i++){
curdiff = nums[i + 1] - nums[i];
// 判断条件应该一致,等号应该给同一个diff。
if((prediff >= 0 && curdiff < 0) || (prediff <= 0 && curdiff > 0)){
res++;
prediff = curdiff;
}
}
return res;
}
}
53. 最大子序和
- 原则:只要连续和不为负数,则一直累加;只要连续和为负数,舍弃之前的累加和,从新的元素开始求和。
- 这个就很清晰,很有成就感
class Solution {
public int maxSubArray(int[] nums) {
int max = Integer.MIN_VALUE;
int res = 0;
for(int i = 0; i < nums.length; i++){
if(res < 0){
res = 0;
}
res += nums[i];
max = max > res ? max : res;
}
return max;
}
}
学习时间:
- 上午半小时,下午两个半小时,整理文档半小时。