题目一 860. 柠檬水找零
思路
只需要考虑3种情况,5、10、20的情况,如果5的话增加5的计数,10的话,增加10计数,同时要减少一个5,如果是20的话,优先选10+5这样的组合,否则选3个五。期间有不符合的就返回false。
/**
* @param {number[]} bills
* @return {boolean}
*/
var lemonadeChange = function(bills) {
let five = 0;
let ten = 0;
for (let i = 0; i < bills.length; i++) {
let val = bills[i];
if (val === 5) {
five++;
} else if (val === 10) {
ten++;
if (five > 0) {
five--;
} else {
return false;
}
} else if (val === 20) {
if (ten > 0 && five > 0) {
ten--;
five--;
} else if (five >= 3) {
five -= 3;
} else {
return false;
}
}
}
return true;
};
题目二 406. 根据身高重建队列
思路
- 按照身高排序,同样身高,k值从小到大排序
- 遍历数组,按照k值做插入算法进行插入,最后就是结果
var reconstructQueue = function(people) {
people.sort((item1, item2) => {
if (item1[0] === item2[0]) {
return item1[1] - item2[1];
}
return item2[0] - item1[0];
})
let result = [];
for (let i = 0; i < people.length; i++) {
const val = people[i];
let targetIndex = val[1];
if (i > targetIndex) {
for (let j = i - 1; j >= targetIndex; j--) {
result[j + 1] = result[j];
}
result[targetIndex] = val;
} else {
result.push(val);
}
}
return result;
};
题目三 452. 用最少数量的箭引爆气球
思路
- 首先按照起始点排序数组
- 如果当前去见的起始值大于上一个区间的结束值,说明两个区间不重叠,结果+1
- 否则说明重叠,并更新当前区间的结束值为当前区间结束值和上一个区间结束值的最小值方便下次判断是否重叠
var findMinArrowShots = function(points) {
const len = points.length;
if (len < 1) {
return 0;
}
points.sort((a, b) => a[0] - b[0]);
let result = 1;
for (let i = 1; i < len; i++) {
if (points[i][0] > points[i - 1][1]) {
result++;
} else {
points[i][1] = Math.min(points[i][1], points[i - 1][1]);
}
}
return result;
};