Leetcode 860.柠檬水找零
题目:860.柠檬水找零
初始思路
思路很简单,5不用找零,10用5找零,20用10+5或者三个5找零
代码
var lemonadeChange = function (bills) {
let five = 0
let ten = 0
for (let bill of bills) {
if (bill === 5) {
// 如果支付5的话,正好
five++
} else if (bill === 10) {
// 如果支付10的话,先用5找零,没有5就直接失败
if (five > 0) {
five--
ten++
} else {
return false
}
} else {
// 如果支付20的话,优先使用10+5,或者三个5
if (ten > 0 && five > 0) {
ten--
five--
} else if (five >= 3) {
five -= 3
} else {
return false
}
}
}
return true
};
感想
- 思路不难,可以简单写出来。
Leetcode 406.根据身高重建队列
题目:406.根据身高重建队列
初始思路
代码
var reconstructQueue = function (people) {
let queue = []
people.sort((a, b) => {
if (b[0] !== a[0]) {
// 如果身高不等的话,身高大的在前面
return b[0] - a[0]
} else {
// 如果身高相等的话,编号小的在前面
return a[1] - b[1]
}
})
for (let i = 0; i < people.length; i++){
// 插入位置
// 第一个参数:规定从何处添加元素(下标),是数字
// 第二个参数:规定要添加多少元素,是数字
// 第三个数字:添加到数组的新元素
queue.splice(people[i][1], 0, people[i])
}
return queue
};
感想
- 首先按照身高排序,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。
- 按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。
Leetcode 452.用最少数量的箭引爆气球
初始思路
代码
var findMinArrowShots = function (points) {
// 按照起始坐标从小到大排序
points.sort((a, b) => {
return a[0] - b[0]
})
// points不为空至少需要一根箭
let res = 1
for (let i = 1; i < points.length; i++){
if (points[i][0] > points[i - 1][1]) {
// 如果下一个气球的起始位置够不到前一个气球的末尾,也就是不重合
// 需要一支箭
res++
} else {
// 更新重叠气球最小右边界,覆盖该位置的值,留到下一步使用
points[i][1] = Math.min(points[i - 1][1], points[i][1])
}
}
return res
};
感想
- 如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。
- 注意题目中说的是:满足 xstart ≤ x ≤ xend,则该气球会被引爆。那么说明两个气球挨在一起不重叠也可以一起射爆