【算法】day 20 leetcode 贪心

一、跳跃游戏

1、题目

55. 跳跃游戏 - 力扣(LeetCode)

2、分析

跟跳跃游戏Ⅱ一样。

3、代码

java 复制代码
class Solution {
    public boolean canJump(int[] nums) {
        int left=0, right=0, maxIndex=0;

        while (left <= right) {
            if (right >= nums.length-1) return true;
            for (int i = left; i <= right; i++) {
                maxIndex = Math.max(maxIndex, nums[i] + i);
            }
            left = right+1;
            right = maxIndex;
        }

        return false;
    }
}

二、跳跃游戏Ⅱ

1、题目

45. 跳跃游戏 II - 力扣(LeetCode)

2、分析

类似层序遍历,left 标记当前第 x 跳的左边界,right 标记当前第 x 跳的右边界,遍历 left 到 right 区间的值,计算 num[i]+i = 下一跳到达的位置,最大位置标记为 maxIndex,即下一跳的右边界。更新 left=right+1,right=maxIndex。

特殊情况,可能怎么跳都达到不了 n-1 的位置。即会出现 right < left 的情况,这个时候就要退出层序遍历,返回不可到达。

时间复杂度:O(n),只遍历了一遍数组。

3、代码

java 复制代码
class Solution {
    public int jump(int[] nums) {
        int left=0, right=0, maxIndex=0, ret=0;

        while (left <= right) {
            if (right >= nums.length-1) return ret;
            for (int i = left; i <= right; i++) {
                maxIndex = Math.max(maxIndex, nums[i] + i);
            }
            left = right+1;
            right = maxIndex;
            ret++;
        }

        return -1;
    }
}

三、划分字母区间

1、题目

763. 划分字母区间 - 力扣(LeetCode)

2、分析

遍历数组,找到每种字母的右边界,用 hash 表存储,每种字母的最后一个字母的位置会覆盖前面的位置,从而获得每种字母的右边界。

再遍历数组,获取已经遍历过的字母中,右边界最大位置,如果最大位置就是当前遍历字母的右边界,则此字母是分割点。

时间复杂度:O(n)。遍历一遍数组,获取字母的右边界;又遍历了一遍数组,找到划分点。

3、代码

java 复制代码
class Solution {
    public List<Integer> partitionLabels(String s) {
        char[] chars = s.toCharArray();
        int n = chars.length;
        int[] right_map = new int[26];
        List<Integer> ret = new ArrayList<>();
        int max_right = 0;
        int index = -1; // 上一个划分点

        // 初始化每种字母的右边界 map
        for (int i = 0; i < n; i++) right_map[chars[i]-'a'] = i;
        // 找划分点
        for (int i = 0; i < n; i++) {
            // 已遍历字母中,右边界的最大值
            max_right = Math.max(max_right, right_map[chars[i]-'a']);
            // 最大右边界刚好是该字母位置
            if (max_right == i) {
                ret.add(max_right - index);
                index = max_right;
            }
        }

        return ret;
    }
}
相关推荐
仰泳的熊猫3 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
似水明俊德6 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
无极低码6 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发6 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre7 小时前
22 括号生成
算法·深度优先
腾阳8 小时前
99%的人忽视了这一点:活着本身就是人生的意义,别让抑郁和内耗成为你的枷锁!
经验分享·程序人生·职场和发展·跳槽·学习方法·媒体
不吃西红柿的858 小时前
[职场] 内容运营求职简历范文 #笔记#职场发展
笔记·职场和发展·内容运营
liyang_8308 小时前
邦芒秘诀:职场高手都具备的三个特征
职场和发展
普通网友8 小时前
十大秘闻:揭秘霍兰德职业兴趣理论的未知面!
职场和发展·求职招聘·职场发展·单一职责原则