算法训练Day35|860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

LeetCode:860.柠檬水找零

860. 柠檬水找零 - 力扣(LeetCode)

1.思路

通过map做映射,记录5,10出现的次数,然后罗列5、10、20出现时对map中元素数量的影响,排除所有不符合条件的,最后符合条件的返回true.

2.代码实现
 1class Solution {
 2    public boolean lemonadeChange(int[] bills) {
 3        // 映射
 4        Map<Integer, Integer> map = new HashMap<>(); 
 5        map.put(5, 0);
 6        map.put(10, 0);
 7        for (int i = 0; i < bills.length; i++) {
 8            if (bills[i] == 5) {
 9                map.put(5, map.get(5) + 1);
10            } else if (bills[i] == 10) {
11                if (map.get(5) > 0) {
12                    map.put(5, map.get(5) - 1);
13                    map.put(10, map.get(10) + 1);
14                } else {
15                    return false;
16                }
17            } else if (bills[i] == 20){
18                if (map.get(5) > 0 && map.get(10) > 0) {
19                    map.put(5, map.get(5) - 1);
20                    map.put(10, map.get(10) - 1);
21                } else if (map.get(5) >= 3){
22                    map.put(5, map.get(5) - 3);
23                } else {
24                    return false;
25                }
26            }
27        }
28        return true;
29    }
30}
3.复杂度分析

时间复杂度:O(n).
空间复杂度:O(1).

LeetCode:406.根据身高重建队列

406. 根据身高重建队列 - 力扣(LeetCode)

1.思路

先判断身高,从高到低排列,对于相同身高按照k值从低到高排列。
方法不熟悉,调用还挺难的…

2.代码实现
 1class Solution {
 2    public int[][] reconstructQueue(int[][] people) {
 3        Arrays.sort(people, (a, b) -> a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]);
 4
 5        List<int[]> list = new ArrayList<>();
 6
 7        for (int i = 0; i < people.length; i++) {
 8            int[] person = people[i];
 9            list.add(person[1], person);
10        }
11        return list.toArray(new int[people.length][]);
12    }
13}
3.复杂度分析

时间复杂度:O(n^2).
空间复杂度:O(n).

LeetCode:452. 用最少数量的箭引爆气球

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

1.思路

对齐左边界,更新右边界,思路清晰,方法调用较弱

2.代码实现
 1class Solution {
 2    public int findMinArrowShots(int[][] points) {
 3        Arrays.sort(points, (a, b) -> Integer.compare(a[0] , b[0]));
 4
 5        int count = 1;
 6        for (int i = 1; i < points.length; i++) {
 7            if (points[i][0] > points[i - 1][1]) {
 8                count++;
 9            } else {
10                points[i][1] = Math.min(points[i - 1][1], points[i][1]);
11            }
12        }
13        return count;
14    }
15}
3.复杂度分析

时间复杂度:O(logn).
空间复杂度:O(1).

4.视频解析

贪心算法,判断重叠区间问题 | LeetCode:452.用最少数量的箭引爆气球_哔哩哔哩_bilibili

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值