[豪の算法奇妙冒险] 代码随想录算法训练营第二十七天 | 455-分发饼干、376-摆动序列、53-最大子序和
代码随想录算法训练营第二十七天 | 455-分发饼干、376-摆动序列、53-最大子序和
LeetCode455 分发饼干
题目链接:https://leetcode.cn/problems/assign-cookies/description/
文章讲解:https://programmercarl.com/0455.分发饼干.html
视频讲解:https://www.bilibili.com/video/BV1MM411b7cq/?vd_source=b989f2b109eb3b17e8178154a7de7a51
先进行排序,然后从胃口最小的孩子开始遍历,把满足其胃口要求的最小尺寸饼干给他,直到无法满足或遍历结束,此时得到题解

class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int cnt = 0;
for(int i = 0; i < g.length; i++){
if(findS(s, g[i])){
cnt++;
}else{
break;
}
}
return cnt;
}
public boolean findS(int[] s ,int G){
for(int i = 0; i < s.length; i++){
if(s[i] >= G){
s[i] = -1;
return true;
}
}
return false;
}
}
LeetCode376 摆动序列
题目链接:https://leetcode.cn/problems/wiggle-subsequence/description/
先进行相邻元素去重,避免平坡,然后分情况讨论
当list只有一个元素时return1,list只有两个元素时return2,list有三个以上元素再进行下一步的计数
list元素有三个以上,则默认头尾两个元素算作两个摆动,cnt从2开始计数,i从list的第二个元素开始遍历到倒数第二个元素,期间若遇到preDiff与curDiff符号不同的情况,则说明来到了拐点,cnt++

class Solution {
public int wiggleMaxLength(int[] nums) {
List<Integer> list = new ArrayList<>();
list.add(nums[0]);
for(int i = 1; i < nums.length; i++){
if(nums[i] != nums[i-1]){
list.add(nums[i]);
}
}
if(list.size() == 1){
return 1;
}
if(list.size() == 2){
return 2;
}
int cnt = 2;
for(int i = 1; i < list.size()-1; i++){
int preDiff = list.get(i) - list.get(i-1);
int curDiff = list.get(i+1) - list.get(i);
if((preDiff > 0 && curDiff < 0)||(preDiff < 0 && curDiff > 0)){
cnt++;
}
}
return cnt;
}
}
LeetCode53 最大子序和
题目链接:https://leetcode.cn/problems/maximum-subarray/description/
文章讲解:https://programmercarl.com/0053.最大子序和.html
视频讲解:https://www.bilibili.com/video/BV1aY4y1Z7ya/?vd_source=b989f2b109eb3b17e8178154a7de7a51
尽可能的让子数组和大,所以当当前ans为负数时要立即抛弃,从下一个重新开始累加

class Solution {
public int maxSubArray(int[] nums) {
int result = Integer.MIN_VALUE;
int ans = 0;
for(int i = 0; i < nums.length; i++){
ans += nums[i];
if(ans > result){
result = ans;
}
if(ans < 0){
ans = 0;
}
}
return result;
}
}

浙公网安备 33010602011771号