思路比较简单
class Solution {
public boolean lemonadeChange(int[] bills) {
//然后向你付 5 美元、10 美元或 20 美元
//如果收到5,直接收下
//如果收到10,需要付回去5
//如果收到20,需要付回去10+5或者5+5+5
//开始时我手上拥有的钱的数量
int five=0;
int ten=0;
int twen=0;
for(int bill:bills){
if(bill==5){
five++;
}
if(bill==10){
five--;
ten++;
}
if(bill==20){
if(ten>0&&five>0){
ten--;
five--;
twen++;
}
else if(five>=3){
five-=3;
twen++;//没有必要加上这句了,因为不会用twen来找零
}
else return false;
}
}
return five>=0&&ten>=0;
}
}
出现两个维度一起考虑的情况
其技巧都是确定一边然后贪心另一边,两边一起考虑,就会顾此失彼。
如果身高相同,按照k值进行升序;如果身高不同,按照身高进行降序
代码实现
class Solution {
public int[][] reconstructQueue(int[][] people) {
//和分发糖果类似,不要两头兼顾,处理好一边再处理另一边。
//先按照身高排序,如果身高相同再按ki升序
Arrays.sort(people,(a,b)->{
if(a[0]==b[0]) return a[1]-b[1];//a-b是升序排列,故在a[0]==b[0]的状况下,会根据k值升序排列
return b[0]-a[0];//在a[0]!=b[0]的状况下,降序排列
});
//以示例为例子,经过sort后会是:
// [7,0],[7,1],[6,1],[5,0],[5,2],[4,4]
LinkedList que=new LinkedList<>();
for(int[] p:people){
que.add(p[1],p);//LinkedList.add(index,value)会将value插入指定index里
}
return que.toArray(new int[people.length][]);
}
}
对使用某一种语言容器的使用,特性的选择都会不同程度上影响效率。
所以很多人都说写算法题用什么语言都可以,主要体现在算法思维上,其实我是同意的但也不同意。
学到的知识点:
1.Arrays.sort()方法底层使用了三种排序方式:
2.在Java中,二维数组可以只定义第一维的长度,而第二维的长度可以不指定。在这种情况下,第二个维度的长度将默认为0。
3.在Java中,LinkedList的add(index, value)方法将value插入到指定index位置时,如果该位置已经有元素存在,则新元素的value会覆盖原有元素的value。
首先根绝xstart进行升序排序因为我们要让气球尽可能重复
如果两个气球有重复部分,则重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭,这个时候要更新一下这一组被比较气球的右边界,如下图要过呢更新气球2的右边界为6,防止气球2和气球3又需要新增一只弓箭。
如果没有重复部分,则需要一只弓箭
可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。
开始的代码
class Solution {
public int findMinArrowShots(int[][] points) {
//按xstart升序排序
Arrays.sort(points,(a,b)->{
return a[0]-b[0];
});
int count=0;
for(int i=0;i
溢出问题
由于Integer类型的最大值为2^31-1,因此使用Integer.compare()方法进行比较不会发生溢出。
修改后的代码
class Solution {
public int findMinArrowShots(int[][] points) {
//按xstart升序排序
// int num=0;
// 使用Integer内置比较方法,不会溢出
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
int count=1;// points 不为空至少需要一支箭
for(int i=0;i