455. 分发饼干
题目描述
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
- 每个孩子
i都有一个胃口值g[i],这是能让孩子满足胃口的饼干的最小尺寸。 - 每块饼干
j都有一个尺寸s[j]。如果s[j] >= g[i],可以将饼干j分配给孩子i,此时该孩子会得到满足。 - 目标是尽可能满足更多的孩子,输出满足孩子的最大数量。
解题思路
-
贪心算法:
- 优先满足胃口值最小的孩子,从而将较小的饼干分配给需求较少的孩子,保留较大的饼干以满足需求较高的孩子。
- 对孩子的胃口值数组
g和饼干尺寸数组s进行排序。 - 两种实现方式:
- 从右往左遍历胃口值数组。
- 从左往右遍历饼干数组。
-
实现步骤:
- 对两个数组
g和s进行排序。 - 使用两个指针,分别记录当前孩子和当前饼干的位置。
- 根据胃口值与饼干尺寸的比较关系,分配饼干并移动指针。
- 对两个数组
代码实现
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
int right = s.length-1;
for(int i=g.length-1;i>=0;i--){
if (right>=0 && g[i] <= s[right]){
right--;
count++;
}
}
return count;
}
}
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
int start = 0;
for(int i=0;i<s.length;i++){
if (start<g.length && s[i]>=g[start]){
start++;
count++;
}
}
return count;
}
}
376. 摆动序列
题目描述
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可以是正数或负数。少于两个元素的序列也是摆动序列。
- 摆动序列示例:
[1,7,4,9,2,5]是一个摆动序列,因为差值(6,-3,5,-7,3)是正负交替出现的。[1,4,7,2,5]不是摆动序列,因为前两个差值都是正数。[1,7,4,5,5]不是摆动序列,因为最后一个差值为零。
目标:给定一个整数序列,返回作为摆动序列的最长子序列的长度。通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。
解题思路
-
贪心算法:
- 通过记录当前差值
curDiff和前一个差值preDiff来判断是否符合摆动序列的条件。 - 当
(curDiff > 0 && preDiff <= 0)或(curDiff < 0 && preDiff >= 0)时,说明找到一个摆动点,计数器count加 1,同时更新preDiff。 - 遍历整个数组即可完成最长摆动子序列的统计。
- 通过记录当前差值
-
特殊情况:
- 如果数组长度小于等于 1,直接返回数组长度即可。
代码实现
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length<=1){
return nums.length;
}
int curDiff = 0;
//上一个差值
int preDiff = 0;
int count = 1;
for(int i=1;i<nums.length;i++){
curDiff = nums[i]-nums[i-1];
if((curDiff>0 && preDiff <=0) || (curDiff < 0 && preDiff >= 0)){
count++;
preDiff = curDiff;
}
}
return count;
}
}
53. 最大子序和
题目描述
给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
解题思路
-
动态规划:
- 遍历数组时,记录当前子数组的最大和
max。 - 如果当前子数组的和小于 0,则将其重置为 0,因为负数会对后续和产生负面影响。
- 同时用一个变量
groupmax来记录遍历过程中出现的最大子数组和。
- 遍历数组时,记录当前子数组的最大和
-
贪心思想:
- 对于每个元素,判断加入当前子数组是否能增大和,如果不能,则重新开始新的子数组。
代码实现
class Solution {
public int maxSubArray(int[] nums) {
int max = 0;
int groupmax = nums[0];
for(int i =0 ;i< nums.length;i++){
max = max + nums[i];
if(groupmax<max){
groupmax = max;
}
if(max<0){
max = 0;
}
}
return groupmax;
}
}
142

被折叠的 条评论
为什么被折叠?



