目录
860 柠檬水找零
class Solution {
public boolean lemonadeChange(int[] bills) {
int five = 0;
int ten = 0;
for(int bill : bills){
if(bill == 5)five++;
else if(bill == 10){
ten++;
five--;
}else{
if(ten > 0){
ten--;
five--;
}else{
five -= 3;
}
}
if(ten < 0 || five < 0)return false;
}
return true;
}
}
时间复杂度O(n)
空间复杂度O(1)
406 根据身高重建队列
people[i] = {h,k};
按照h对people数组进行降序排序,如果身高相同则按照k进行升序排序。
创建链表res来存储重建后的顺序。
遍历people数组并加入到res的正确位置下。
将res转化为数组并返回。
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people,(a,b) -> {
if(a[0] == b[0])return a[1] - b[1];
return b[0] - a[0];
});
List<int[]>res = new LinkedList<>();
for(int[] o : people){
res.add(o[1],o);
}
return res.toArray(new int[people.length][]);
}
}
时间复杂度O(n^2)
空间复杂度O(logn)
452 用最少数量的箭引爆气球
使points从小到大排序,设置变量res记录箭的个数,len记录此时区间的右端点并将初始值设置为第一个区间的右端点。遍历points,有如下两种情况:
- 如果len大于或者等于新区间的左端点,说明箭可以一同引爆新气球,不需要新加入箭,使len取得len与此区间右端点之间的最小值。
- 如果len小于新区间的左端点,说明需要新加入箭,将res++,并且len赋值为新区间的右端点。
最后返回res
class Solution {
public int findMinArrowShots(int[][] points) {
Arrays.sort(points,(o1, o2) -> Integer.compare(o1[0],o2[0]));//使用Integer内置比较方法,否则会溢出
int res = 1;
int len = points[0][1];
for(int i = 1;i < points.length;i++){
if(len >= points[i][0]){
len = Math.min(len,points[i][1]);
}else{
len = points[i][1];
res++;
}
}
return res;
}
}
时间复杂度O(nlogn)
空间复杂度O(logn)