860.柠檬水找零
/**
* @param {number[]} bills
* @return {boolean}
*/
var lemonadeChange = function(bills) {
let d5=0
let d10=0
let d20=0
for(let i=0;i<bills.length;i++){
if(bills[i]===5){
d5+=1
}
else if(bills[i]===10){
if(d5>=1){
d5--
d10++
}
else
return false
}
else
{
if(d5>=1&&d10>=1){
d5--
d10--
}
else if(d5>=3){
d5-=3
}
else
return false
}
}return true
};
406.根据身高重建队列
/**
* @param {number[][]} people
* @return {number[][]}
*/
var reconstructQueue = function(people) {
// people.sort((x,y)=>y[0]-x[0])
people.sort((a, b ) => {
if(b[0] !== a[0]) {
return b[0] - a[0]
} else {
return a[1] - b[1]
}
})
let ok=[]
for(let i=0;i<people.length;i++){
ok.splice(people[i][1],0,people[i]) //纯增加情况
}
return ok
};
想法
困难
people.sort((a, b ) => {
if(b[0] !== a[0]) {
return b[0] - a[0]
} else {
return a[1] - b[1]
}
})
先按升高从大到小排,如果身高一样,就按人数从小到大排队
452. 用最少数量的箭引爆气球
/**
* @param {number[][]} points
* @return {number}
*/
var findMinArrowShots = function(points) {
points.sort((x,y)=>(x[0]-y[0]))
//按开始节点排序
let r=0
for(let i=0;i<points.length-1;i++){
//有重叠,(两个气球化为一个气球),更新最右边框
if(points[i][1]>=points[i+1][0]){
points[i+1][1]=points[i+1][1]>points[i][1]?points[i][1]:points[i+1][1]
}
//没有重叠,说明可以射出箭了
else
r++
}
return r+1
};
想法
局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。