【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:正着往前推(待解决)

相关推荐
七夜zippoe18 小时前
缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(三)
java·开发语言·缓存
lllsure18 小时前
【Docker】镜像
java·spring cloud·docker
zhysunny18 小时前
51.不可变基础设施:云原生时代的「乐高城堡」建造法
java·云原生
无名客018 小时前
SQL语句执行时间太慢,有什么优化措施?以及衍生的相关问题
java·数据库·sql·sql语句优化
qq_4335545418 小时前
C++ Dijkstra堆优化算法
开发语言·c++·算法
风槐啊18 小时前
邪修实战系列(3)
java·ide·spring boot·spring·tomcat
咋吃都不胖lyh18 小时前
SQL数据分析原代码--创建表与简单查询
java·数据库·sql
毕设源码-朱学姐18 小时前
【开题答辩全过程】以 _基于SpringBoot技术的“树洞”心理咨询服务平台的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
boonya18 小时前
Java内存模型与线程私有共享区域与直接内存的理解
java·开发语言·内存模型
axban18 小时前
QT M/V架构开发实战:QAbstractItemModel介绍
java·数据库·qt