算法刷题日志——贪心

文章目录

    • 跳跃游戏
    • [跳跃游戏 II](https://leetcode.cn/problems/jump-game-ii/description/)
    • 用最少数量的箭引爆气球

跳跃游戏

算法刷题日志——贪心_第1张图片

如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点
可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新
如果可以一直跳到最后,就成功了
num[i]+i 意思就是当前坐标位置加上当前坐标能跳的最远距离

class Solution {
    public boolean canJump(int[] nums) {
        int k=0;
        for(int i=0;i<nums.length;i++){
            if(i>k)return false;
            k=Math.max(nums[i]+i,k);
        }
        return true;
    }
}

跳跃游戏 II

算法刷题日志——贪心_第2张图片

和上题差不多,far代表的是能跳的最远距离,然后因为一定能到终点,end表示的是当前所在位置能跳到的最远距离,如果到了end代表已经到了最远的地方就该跳跃到下一个位置了。然后cnt用来记录跳跃次数最后返回。

class Solution {
    public int jump(int[] nums) {
        int n= nums.length;
        int end=0;
        int far = 0;
        int cnt=0;
        for(int i=0;i<n-1;i++){
            far=Math.max(nums[i]+i,far);
            if(i==end){
                end=far;
                cnt++;
            }
        }
    return cnt;
    }
}

用最少数量的箭引爆气球

当气球出现重叠,一起射,所用弓箭最少
既然按照起始位置排序,那么就从前向后遍历气球数组,靠左尽可能让气球重复。

算法刷题日志——贪心_第3张图片

class Solution {
    public int findMinArrowShots(int[][] points) {
        if (points.length == 0) return 0;
        //排序按数组中的第一个元素大小从小到大来排序
        Arrays.sort(points, (o1, o2) -> Integer.compare(o1[0], o2[0]));

        int count = 1;
        for (int i = 1; i < points.length; i++) {
            if (points[i][0] > points[i - 1][1]) {
                count++;
            } else { // 气球i和气球i-1挨着
                points[i][1] = Math.min(points[i][1],points[i - 1][1]);// 更新重叠气球最小右边界
            }
        }
        return count;
    }
}

你可能感兴趣的:(算法,leetcode,数据结构,java)