题目详细:LeetCode.860
一道非常简单的模拟题,根据题目要求编写程序即可:
Java解法(模拟):
class Solution {public boolean lemonadeChange(int[] bills) {int money_5 = 0, money_10 = 0;for(int b : bills){if(b == 5){money_5++;}else if(b == 10){money_10++;money_5--;}else if(b == 20){if(money_10 > 0){money_10--;money_5--;}else{money_5 -= 3;}}if(money_5 < 0 || money_10 < 0)return false;}return true;}
}
题目详细:LeetCode.406
这道题与上一节的练习《分发糖果》有异曲同工之妙,当我们题目有两个维度时,如本题,有两个比较纬度身高h和数量k,所以看到这种题目一定要想先确定哪一个维度,再考虑能不能按照另一个维度重新排列得到正确结果,不能够两个维度条件同时考虑。
解题过程如下:
注意:身高为什么一定是从大到小排?
Java解法(先按身高排序,再按k值插入):
class Solution {public int[][] reconstructQueue(int[][] peoples) {// 按身高从大到小排序,身高相同则k值小的在前Arrays.sort(peoples, (a, b) -> {if(a[0] == b[0])return a[1] - b[1];return b[0] - a[0];});// 按照k值依次插入List ans = new ArrayList<>();for(int[] people : peoples){ans.add(people[1], people);}return ans.toArray(new int[peoples.length][]);}
}
题目详细:LeetCode.452
注意本题一个非常坑的测试数据:
[[-2147483646,-2147483645],[2147483646,2147483647]]
在对输入数据进行排序时,需要使用Integer内置的比较器,来防止输入数据溢出。
这道题的思路比较简单,但是我觉得我的表述可能不是很清晰,详细的题解可查阅:《代码随想录》— 用最少数量的箭引爆气球
Java解法(先排序,确定重叠的边界,进而确定箭的数量):
class Solution {public int findMinArrowShots(int[][] points) {Arrays.sort(points, (a, b) -> {// 不能使用 return a[0] - b[0];// 这里需要使用内置的比较器,防止数据溢出return Integer.compare(a[0], b[0]);});// points.length >= 1,所以至少会射出一支箭int count = 1; for(int i = 1; i < points.length; i++){if(points[i - 1][1] < points[i][0])// 如果当前气球的左边界和上一个气球的右边界没有交集// 则说明两个气球没有重叠,需要多射出一支箭count++;else// 如果当前气球的左边界和上一个气球的右边界存在交集// 则当前气球保留一个最小最右边界值,即与上一个气球重叠的最右边界值points[i][1] = Math.min(points[i][1], points[i - 1][1]);}return count;}
}
上一篇:电影《断网》观后感
下一篇:安全运维到安全运营的转变