455.分发饼干
小饼干给小孩子吃,for循环遍历饼干,尽量满足一个孩子再满足下一个
先满足大孩子的胃口,for循环遍历胃口,尽量吃掉一个饼干再吃下一个
376.摆动序列
记录本次差和上次差,符合条件则++
注意:连续差为0时如何删
53.最大子数组和
记录最大连续和cnt,cnt每次添加数组的一位数,当当前最大连续和小于0时,设置连续和为0,重新开始规划新的子数组
赋值sum为cnt和原sum的最大值,即确定最大的子数组和
122.买卖股票的最佳时机II
计算从第二天开始每天与前一天的差值,如果差值大于0就加到结果中,如果小于0就不加
prices[3] - prices[0] = (prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])
55.跳跃游戏
需要在每一步的覆盖范围内往下循环看有没有某一步可以覆盖到终点后
45.跳跃游戏II
每遍历一位时都要确定当前范围及在此范围内下次能到达的最大范围,下次能到达终点则cnt+1,如果到本次范围的最后一位时,更新当前范围。
1005.K次取反后最大化的数组和
思路很简单,有几个语法需要注意一下
// 按绝对值从大到小排序
nums = IntStream.of(nums) // 将整数数组nums转化为IntStream
.boxed() // 将IntStream转换成Stream<Integer>
.sorted((o1, o2) -> Math.abs(o2)-Math.abs(o1)) // 按绝对值从大到小排队
.mapToInt(Integer::intValue).toArray(); // 转换为整数数组
// 计算数组和
Arrays.stream(nums).sum()
134.加油站
如果一圈的供小于求则跑不完一圈,-1;
如果当前0-i的供小于求,那么到i会断油,需要从i+1开始出发继续算。
135.分发糖果
单向考虑,先整理“右>左”(从左到右遍历),再整理“左>右”(从右到左遍历),不然会乱。
遍历顺序不可颠倒
860.柠檬水找零
管理5和10的数量即可,注意收到20时首先找10+5再找5+5+5
406.
先按照身高从大到小排序,相同身高再按照k从小到大排
相同k时,list第二次插入的数会排在第一次插入的前面,例如[5, 0]在[7,0]前面
需要注意的语法
Arrays.sort(people, ((o1, o2) -> {
if (o1[0] == o2[0])
return o1[1]-o2[1]; // 按第二个元素升序
return o2[0]-o1[0]; //第一个元素降序
}))
List<int[]> list = new ArrayList<>();
for (int[] p: people) {
list.add(p[1], p); // 把p插入到下标p[1]的位置
}
list.toArray(new int[people.length][]); // 链表转二维数组,必须指定长度
452.用最少数量的箭引爆气球
这题有点难
按第一个元素排序的时候尽量用Integer.compare,不然对大数字会出错
Arrays.sort(points, (o1, o2) -> Integer.compare(o1[0], o2[0]));
如果可以在一箭射中,那就更新这一箭的气球组结尾为最短的那个值
435.无重叠区间
和452很像,都需要先排序然后计算交叉数量
763.划分字母区间
先统计一轮每个字母的最远下标
然后遍历,维护一个目前最大下标和上次最大下标,如果当前i为目前最大下标,则计算长度加入list,否则看看是否需要更新目前最大下标
需要注意对第一个字符的单独判断
56.合并区间
因为弄不清楚在哪里加入结果集迷糊了半天改来改去
最好想通思路然后再动手写
738.单调递增的数字
这题最好变成String[]做,比较好改
需要维护一个变量start,当i-1位需要-1时,start为i,最后把i和以后的数字都变成9
注意语法:
// 把int型n转换为String之后再以每个字符切分成数组
String[] strings = (n+"").split("");
// 把数组strings组合起来变成String,然后再转变成整型
Integer.parseInt(String.join("", strings))
968.监控二叉树
设置每个节点的三种状态,从叶子节点到根节点后序遍历,0无覆盖,1有摄像头,2有覆盖。