【leetcode 100】贪心Java版本

划分字母区间

题目

我的思路:第一次没有一点思路,第二次看了官网思路后,写的以下答案,没有搞明白循环遍历,

//是不对的以下:

cpp 复制代码
class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> list=new ArrayList<>();
        int[] endPos=new int[26];
        for(int i=0;i<s.length();i++)
        {
            endPos[s.charAt(i)-'a']=i;
        }
        int end=0,start=0;
        while(start!=s.length()-1)
        {
        for(int i=start;i<=end;i++)
        {
            end=Math.max(end,endPos[i]);//这样结束的不对!,不跳出来怎么能加到list结果里呢
            
        }
        list.add(end-start+1);
        start=end+1;
        }
        return list;
        
    }
}

官方答案:

cpp 复制代码
class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] last = new int[26];
        int length = s.length();
        for (int i = 0; i < length; i++) {
            last[s.charAt(i) - 'a'] = i;
        }
        List<Integer> partition = new ArrayList<Integer>();
        int start = 0, end = 0;
        for (int i = 0; i < length; i++) {
            end = Math.max(end, last[s.charAt(i) - 'a']);
            if (i == end) {
                partition.add(end - start + 1);
                start = end + 1;
            }
        }
        return partition;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/partition-labels/solutions/455703/hua-fen-zi-mu-qu-jian-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

55. 跳跃游戏

题目

我的思路:加入从0跳到第i个位置,那么0i之间的所有位置都可以到达,遍历0 i之间的所有位置,看它最远能到哪里,然后看最后能超过n-1,超过了说明能跳到n-1。但是又是很模糊的感觉,不知道具体怎么去"遍历"。

看了答案后写的:

注意思路是维护的是一个变量即最远能到达的位置,不是为每个位置都维护,这与上一题不同,上一题记录的是每个字母最远能到的位置。

cpp 复制代码
class Solution {
    public boolean canJump(int[] nums) {
        int far=0;
        for(int i=0;i<=far;i++)//这里每次结束遍历的都是到最远的位置,官方答案是n,里面加了个if判断
        {
            far=Math.max(far,i+nums[i]);
            if(far>=nums.length-1)
                return true;
        }
        return false;
    }
}

45. 跳跃游戏II

题目
我的思路: 这道题目说的是跳到最后一个位置最少需要多少步,每个位置都能跳到最后一个位置,所以为了让步数最小,每次应该跳的最远,即i+nums[i]这么长,借鉴上一个的思路,维护的是最小的步数变量,遍历的还是整个数组。后来写出来不对,感觉可以用动态规划来做?

我写的有问题:超出时间限制(待解决)

cpp 复制代码
//错误!!!!!
class Solution {
    public int jump(int[] nums) {
        int n=nums.length;
        int res=Integer.MAX_VALUE;
        for(int i=0;i<n;i++)
        {
            int count=0;
            for(int j=i;j<n;)
            {
                j=j+nums[j];      
                count++;         
            }
             res=Math.min(res,count+1); //最小是一步?
        }
        return res;
    }
}

官方答案思路:
方法1:倒着往前推。此处贪心的思路是:有多个可以跳到最后一个位置的情况时,也就是对应下标最小的那个。

cpp 复制代码
class Solution {
    public int jump(int[] nums) {
        int position=nums.length-1;
        int step=0;
        while(position>0) //等于0就没必要跳了
        {
            for(int i=0;i<position;i++)
            {
                if(i+nums[i]>=position)
                {
                    position=i;
                    step++;
                    break;
                }
            }

        }
        
        return step;
    }
}

方法2:正着往前推(待解决)

相关推荐
生信碱移2 分钟前
单细胞空转CNV分析工具:比 inferCNV 快10倍?!兼容单细胞与空转的 CNV 分析与聚类,竟然还支持肿瘤的亚克隆树构建!
算法·机器学习·数据挖掘·数据分析·聚类
CYTElena3 分钟前
JAVA关于集合的笔记
java·开发语言·笔记
源码获取_wx:Fegn089511 分钟前
基于springboot + vueOA工程项目管理系统
java·vue.js·spring boot·后端·spring
短剑重铸之日12 分钟前
《Java并发编程研读》第三章:锁机制
java·java并发编程·java锁机制
一 乐21 分钟前
健康管理|基于springboot + vue健康管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·学习
是三好24 分钟前
分布式事务seata
java·分布式·seata
Brduino脑机接口技术答疑33 分钟前
TDCA 算法在 SSVEP 场景中:Padding 的应用对象与工程实践指南
人工智能·python·算法·数据分析·脑机接口·eeg
为什么要做囚徒1 小时前
多线程基础系列-线程死锁
java·多线程
bluetata1 小时前
在 Spring Boot 中使用 Amazon Textract 从图像中提取文本
java·spring boot·后端
keep_learning1111 小时前
Z-Image模型架构全解析
人工智能·算法·计算机视觉·大模型·多模态