【算法】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 区间的值,计算 numi+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;
    }
}
相关推荐
不正经学生36 分钟前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥3 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲3 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
圣保罗的大教堂4 小时前
leetcode 1406. 石子游戏 III 困难
leetcode
晊晌_h5 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦5 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考5 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客6 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
丰锋ff7 小时前
面试问题合集
面试·职场和发展
颜挺锐7 小时前
如何轻松通过性能测试之第四篇:性能测试项目怎么交付?一文讲透九步实施流程(附面试话术 + 实战清单)
面试·职场和发展