【算法】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;
    }
}
相关推荐
AndrewHZ1 分钟前
【复杂网络分析】什么是图神经网络?
人工智能·深度学习·神经网络·算法·图神经网络·复杂网络
Swizard8 分钟前
拒绝“狗熊掰棒子”!用 EWC (Elastic Weight Consolidation) 彻底终结 AI 的灾难性遗忘
python·算法·ai·训练
牛客企业服务1 小时前
AI面试选型策略:9大维度避坑指南
人工智能·面试·职场和发展
fab 在逃TDPIE1 小时前
Sentaurus TCAD 仿真教程(十)
算法
天赐学c语言1 小时前
12.19 - 买卖股票的最佳时机 && const的作用
c++·算法·leecode
菜鸟233号1 小时前
力扣78 子集 java实现
java·数据结构·算法·leetcode
yesyesyoucan1 小时前
在线魔方解谜站:从零入门到精通的智能魔方学习平台
学习·算法
Han.miracle2 小时前
数据结构与算法--008四数之和 与经典子数组 / 子串问题解析
数据结构·算法
!停2 小时前
字符函数和字符串函数
算法
AI科技星2 小时前
圆柱螺旋运动方程的一步步求导与实验数据验证
开发语言·数据结构·经验分享·线性代数·算法·数学建模