455.分发饼干
- 刷题https://leetcode.cn/problems/assign-cookies/description/
- 文章讲解https://programmercarl.com/0455.%E5%88%86%E5%8F%91%E9%A5%BC%E5%B9%B2.html
- 视频讲解https://www.bilibili.com/video/BV1MM411b7cq/?vd_source=af4853e80f89e28094a5fe1e220d9062
题解(贪心思路1:先满足大胃口):
java
class Solution {
//贪心思路1:先满足大胃口
public int findContentChildren(int[] g, int[] s) {
//贪心算法必须先排序
Arrays.sort(g);
Arrays.sort(s);
int result = 0;
int start = s.length - 1;
//胃口无回溯遍历,一直往前遍历;循环饼干进行投喂
for(int index = g.length - 1; index >= 0; index--){
//当饼干能满足胃口
if(start >= 0 && g[index] <= s[start]){
start--;
result++;
}
}
return result;
}
}
题解(贪心思路2:先满足小胃口):
java
class Solution {
//贪心思路2:先满足小胃口
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int result = 0;
int start = 0;
for(int i = 0; i < s.length && start < g.length; i++){
//当饼干能够满足胃口,结果+1
if(s[i] >= g[start]){
start++;
result++;
}
}
return result;
}
}
376. 摆动序列
- 刷题https://leetcode.cn/problems/wiggle-subsequence/description/
- 文章讲解https://programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html
- 视频讲解https://www.bilibili.com/video/BV17M411b7NS/?vd_source=af4853e80f89e28094a5fe1e220d9062
题解(摆动序列差值法):
java
class Solution {
//摆动序列差值法
public int wiggleMaxLength(int[] nums) {
//当只有一个元素时默认有1个摆动,没有元素则返回0个摆动
if(nums.length <= 1){
return nums.length;
}
//记录当前元素的当前差值和上次差值,二者以双指针形式进行遍历
int curDiff = 0;
int preDiff = 0;
//记录摆动的个数
int result = 1;
//因为从第二个元素开始才有差值,所以下标从1开始
for(int i = 1; i < nums.length; i++){
//记录当前差值
curDiff = nums[i] - nums[i - 1];
//Debug点:只有当curDiff发生变化时才会进行指针交替操作
//防止出现在上坡或者下坡过程中发生摆动的错误识别
//Debug点:注意两种平坡情况,不能只顾着双指针交替
//1、单调中的平坡
//2、上下坡中的平坡
//如果当前差值和上一个差值为一正一负则说明找到了一个摆动
//若curDiff为0说明当前正在平坡中,不需要更新preDiff
//直到curDiff不为零时,更新preDiff,可以越过这个上下坡过程中的平坡
if((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)){
result++;
preDiff = curDiff;
}
}
return result;
}
}
53. 最大子序和
- 刷题https://leetcode.cn/problems/maximum-subarray/description/
- 文章讲解https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.html
- 视频讲解https://www.bilibili.com/video/BV1aY4y1Z7ya/?vd_source=af4853e80f89e28094a5fe1e220d9062
题解(正收益贪心思想):
java
class Solution {
//运用收益思想:
//只有正数才能对最后结果带来增益,只要是负数就会降低最后的增益
//又因为是连续的数组,所以在这里的思想就是:
//不断收集正收益的sum,遇见负收益就忽略它,重新开始计算收益
public int maxSubArray(int[] nums) {
//当数组长度为1时,本身就是最大收益,直接返回
if(nums.length == 1){
return nums[0];
}
//因为sum要记录当前序列的最大值,所以这里初始化为最小值
int sum = Integer.MIN_VALUE;
//记录当前序列的和
int count = 0;
for(int i = 0; i < nums.length; i++){
count += nums[i];
//sum始终更新为当前序列的最大值
sum = Math.max(sum, count);
if(count <= 0){
//debug点:是负收益,而不是遇见负值,二者要做区分
//若当前为负收益元素,则重置当前序列和为0,重新开始收益
count = 0;
}
}
return sum;
}
}