JAVA刷Leecode-贪心算法
算法思想
采用贪心的策略,保证每次操作都是局部最优解,从而最终的结果是全局最优。贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具有无后效性,即某个状态以前的过程不会影响以后的状态,只和当前的状态相关。
分为分配问题(455,135)和区间问题(435);
练习:605,452,763,122,406。
区间问题-划分字母区间(763,medium)
题目描述
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
输入输出样例
示例1
输入:S = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
划分结果为 “ababcbaca”, “defegde”, “hijhklij”。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 的划分是错误的,因为划分的片段数较少。
解题思路:
遍历字符串统计字符最后的下标位置。基于贪心思想:只要每个字符串片段的长度最短,就保证得到的片段数最多
题解
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> partition = new ArrayList<>();
if(S.length() <= 0 || S == null){
return partition;
}
int[] last = new int[26];
Arrays.fill(last,0);
int n = S.length();
for(int i = 0; i < n; i++){
last[S.charAt(i) - 'a'] = i;
}
int start = 0, end = 0;
for(int i = 0; i < n; i++){
end = Math.max(end,last[S.charAt(i) - 'a']);
if(i == end){
partition.add(end - start + 1);
start = end + 1;
}
}
return partition;
}
}
资源学习
来自LeetCode 101:和你一起你轻松刷题(C++)(github.com/changgyhub/leetcode_101)和leetcode题库(https://leetcode-cn.com/problems/non-overlapping-intervals)