分发饼干
看完题后的思路
尽可能不让饼干浪费,将饼干与孩子排序,将最大的饼干分配给第一个小于等于它的孩子,依次类推。
代码
class Solution {
// 455. 分发饼干
// 455. 分发饼干
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int child=g.length-1;// 将要分配饼干的孩子
int cookie=s.length-1;// 饼干
int res=0;
while (cookie>=0){
while (child>=0&&g[child]>s[cookie]){
child--;
}
// 没找到
if (child==-1){
break;
}
// 找到
res++;
cookie--;
child--;
}
return res;
}
}
复杂度
时间复杂度 0(m+n) m:孩子 n:饼干
收获
三刷看一遍
376. 摆动序列
贪心算法
看完题后的思路
记录下相邻元素之差,然后从第一个元素开始找,统计+ - ± 的数量
初始化摆动序列末尾差值: 第一组不等于0的相邻两个元素
以后的判断: 末尾差值*当前差值<0 符合要求,加入
代码
// 376. 摆动序列
public int wiggleMaxLength(int[] nums) {
if (nums.length==1){
return nums.length;
}
int diff; // diff 相邻的差值
int end=0;
int res=0; // 【a,b】为一个序列,res是序列数,不是元素数
boolean flag=true;
for (int i = 0; i < nums.length-1; i++) {
diff=nums[i+1]-nums[i];
if (diff!=0&&flag){ // 寻找第一组差值不为0的相邻元素
flag=!flag;
end=diff;
res=1;
}
if(end!=0&&diff*end<0){ // 找到后,以后的判断
end=diff;
res++;
}
}
return res+1;
}
}
复杂度
时间复杂度 0(n)
空间复杂度 0(1)
收获
三刷敲一遍
动态规划
53. 最大子序和
看完题后的思路
对于一个序列,进行累加,并统计最大和。当该序列小于等于0,立刻放弃该序列,从当前元素下一个重新算起,因为新加入的元素一定会被消耗。
代码
class Solution {
public int maxSubArray(int[] nums) {
int sum=Integer.MIN_VALUE;
int count=0;
for (int i = 0; i < nums.length; i++) {
count+=nums[i];
sum= Math.max(sum,count);
if (count<=0){
count=0;
}
}
return sum;
}
}
复杂度
时间 0(n)
空间 0(1)
收获
三刷刷一遍