【LeetCode Hot100】贪心篇
前言
本文用于整理LeetCode Hot100中题目解答,因题目比较简单且更多是为了面试快速写出正确思路,只做简单题意解读和一句话题解方便记忆。但代码会全部给出,方便大家整理代码思路。
121. 买卖股票的最佳时机
一句话题意
给定一个数组,问数组中后面的值减前面的值的最大差值。
一句话题解
每个值都要去和他后面最大的值做差,贪心。
class Solution {public int maxProfit(int[] prices) {int ans=0;int mx=0;for(int i=prices.length-1;i>=0;i--){mx=Math.max(mx,prices[i]);ans=Math.max(ans,mx-prices[i]);}return ans;}
}
55. 跳跃游戏
一句话题意
初始在1号点,数组上的数值为可以移动的距离,问是否能到达数组末端。
一句话题解
贪心,类似线段覆盖,把当前可以走的最大值拿着看之后能不能走就行。
class Solution {public boolean canJump(int[] nums) {int mx=0;for(int i=0;i<nums.length;i++){if(i>mx)break;if(i==nums.length-1)return true;mx = Math.max(mx,i+nums[i]);}return false;}
}
45. 跳跃游戏 II
一句话题意
跟上个题意类似,就是需要额外求最少跳跃次数。
一句话题解
将每次能到达的最远位置保存和下一次能到达的最大距离保存,当到达这次的最远距离了,就让ans++,更新最远距离。
class Solution {public int jump(int[] nums) {int ans=0;int end=0;int mx=0;for(int i=0;i<nums.length - 1;i++){mx=Math.max(mx,nums[i]+i);if(i==end){ans++;end=mx;}}return ans;}
}
763. 划分字母区间
一句话题意
给定一个字符串,问最多可以分割成多少个字符串,保证每个字符只出现在一个字符串内。
一句话题解
先求一下每个字符最后出现的位置,然后类似上个题目的解决方法,就是拿每个的最后的位置,到达最后的哪个位置了意味着就要分割了,然后再继续向下求即可。
class Solution {public List<Integer> partitionLabels(String s) {int[] c=new int[26];for(int i=0;i<s.length();i++){c[s.charAt(i)-'a']=i;}List<Integer> ans = new ArrayList<>();int mn=0;int mx=0;for(int i=0;i<s.length();i++){mx=Math.max(mx,c[s.charAt(i)-'a']);if(mx==i){ans.add(mx-mn+1);mn=mx+1;}}return ans;}
}