互联网网站建设新闻,咨询工程师,建设投资平台网站,搭建公司介绍网站柠檬水找零
题目详细#xff1a;LeetCode.860
一道非常简单的模拟题#xff0c;根据题目要求编写程序即可#xff1a;
Java解法#xff08;模拟#xff09;#xff1a;
class Solution {public boolean lemonadeChange(int[] bills) {int money_5 0, money_10 0;fo…柠檬水找零
题目详细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所以看到这种题目一定要想先确定哪一个维度再考虑能不能按照另一个维度重新排列得到正确结果不能够两个维度条件同时考虑。
解题过程如下
先确定一个维度我先按照身高h来排序身高一定是从大到小排序身高相同的话则k值较小的站前面保证前面的节点一定都比当前节点高。再确定另一维度 局部最优解身高从高到低依次按people的k值来插入列表也就是将k值作为下标来执行插入操作这样使得people插入后列表仍满足题目的排列要求全局最优解全部元素都插入完成整个队列仍满足题目的排列要求
注意身高为什么一定是从大到小排
因为身高从小到大排序后续完成插入后结果无法满足题目的排列求每个节点“前面正好有 k 个身高大于或等于 h 的人”的要求同理如果这题要求为“前面正好有 k 个身高大于或等于 h 的人”则先将身高从小到大排序
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值依次插入Listint[] 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;}
}