用代码模拟实际场景,关键是通过计算机思维考虑清楚如何一步一步得到结果。
452. 用最少数量的箭引爆气球
将气球数组排序后,用代码模拟射箭过程。需要判断怎么射最优。
那么如何判断呢?如果 points[i][0] >= points[i - 1][1]
则说明不重叠,需要弓箭数加一;
否则,说明两个气球重叠,那么再判断下一个气球是否与当前两个重叠。
如何判断呢?points[i + 1][0] < Math.min(points[i][1], points[i - 1][1])
56. 合并区间
与上题类似。
406. 根据身高重建队列
用代码模拟重建队列过程。遍历队伍,高个子先排,这样无论低个子如何排都不会影响高个子的权重。
因此需要首先按身高排序好。
860. 柠檬水找零
遍历每一位顾客的购买柠檬水过程,判断手中的零钱是否足够找零。
如何判断呢?保存手中的钞票数量,如果顾客支付 10 元,那么需要一张 5 元钞票,不够则无法找零;
如果顾客支付 20 元,那么可以是 3 张 5 元钞票,也可以是 1 张 5 元和 1 张 10 元钞票,优先考虑包含 10 元的情况,因为 5 元钞票用途更广。
134. 加油站
用代码模拟汽车行驶过程,在每一个站点判断汽油消耗是否足够到达下一个站点。
如何判断呢?如果当前汽油不足以支撑消耗(即 gas[i] - cost[i] < 0),那么表示无法继续行驶。
763. 划分字母区间
对每一个字母判断它的 lastIndex,如果大于当前 lastIndex则更新 lastIndex,如果遍历到 lastIndex 位置,那么表示得到了一个完整的字母区间。
如何判断字母的 lastIndex 呢?先遍历一遍字符串,在 hash 表中保存好每个字母的 lastIndex。