贪心算法part04
LC860柠檬水找零(未掌握)
- 未掌握分析:20的时候找零卡住,同时贪心思路就想了很久
- 当bill[i]=20的时候,我们有两种找零范式,找零10、5和找零三个5,优先找零10、5,因为三个5是可以替代10、5的情况的,我们需要留着三个5防备其他情况。
- 代码
LC406根据身高重建队列(未掌握)
- 两个维度的题目,与LC135分糖果一样,一定要先确定一个维度,再确定另一个维度。如果两个维度一起考虑一定会顾此失彼。
- 如果是先按照K从小到大排序,可以发现K维度和h维度哪个都没有确定下来,与思想违背,因为先确定h再确定k
- h从大到小排(h相同的话则k小的站前面),让高个子在前面
- 只需要按照k为下标重新插入队列,因为身高是按照高到低排序的,因此可以保证下标k之前一定有个k(0-k-1)个人身高大于或者等于k处的身高
- ==使用lambda函数完成数组的排序,需要熟悉这种写法(a,b)->{if(a[0]b[0]) return a[1]-b[1];else return b[0]-a[0];}
- 向list的指定位置插入元素的方法:add(index,value)
- list转换为数组list.toArray(new int[nums.length]);
- 代码
LC452用最少数量的箭引爆气球(未掌握)
- 最初的思考是把数组看作是一段范围,只要范围重合了一个箭就可以解决,但是思路是有问题的,因为三个数组不一定全部都有重叠部分,可能是两两重叠两两重叠(此时需要两个箭,但是只计数了1),原本的想法只统计了孤立的范围的个数,但是却并不是结果数
- 算法的思路:当气球出现重叠,一起射,所用弓箭最少
- 为了让气球尽可能的重叠,需要对数组进行排序
- 如果气球重叠了,重叠气球中右边边界的最小值之前的区间一定需要一个弓箭
- 代码思路即每次都取重叠范围的最小右边界,如果不重叠就result++
- 代码
数组排序出错,因为使用的a[0]-b[0]=-2147483646-2147483646会导致数值溢出
[[-2147483646,-2147483645],[2147483646,2147483647]]-》[[2147483646,2147483647],[-2147483646,-2147483645]]
将return a[0-]b[0]改为Integer.compare(a[0],b[0])
只关注右边界,如果i+1的左边界大于i的右边界那肯定需要一箭,如果小于等于则取右边界的最小值,因此追求的是用最少的箭