- 435. 无重叠区间
- 763.划分字母区间
- 1. 统计每个字母最后出现的位置
- 2. 当遍历到这个位置时,输出范围
package algor.trainingcamp;
import java.util.Arrays;
/**
* @author lizhe
* @version 1.0
* @description: 给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode.cn/problems/non-overlapping-intervals
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*
* 贪心: 处理重叠问题,如果重叠了 去除区间大的
* @date 2023/5/10 07:56
*/
public class LeetCode435 {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a,b)-> {
return Integer.compare(a[0],b[0]);
});
int preRight = intervals[0][1];
int remove = 0;
for(int i = 1;i < intervals.length;i++){
//区间重叠,需要移除右边界大的
if(preRight > intervals[i][0]){
preRight = Math.min(intervals[i][1], preRight);
remove++;
}else{
preRight = intervals[i][1];
}
}
return remove;
}
}
package algor.trainingcamp;
import java.util.ArrayList;
import java.util.List;
/**
* @author lizhe
* @version 1.0
* @description:
* 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,
* 同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
* 示例:
*
* 输入:S = "ababcbacadefegdehijhklij"
* 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
* 提示:
*
* S的长度在[1, 500]之间。
* S只包含小写字母 'a' 到 'z' 。
* @date 2023/5/10 08:10
*
* 1. 统计每个字母最后出现的位置
* 2. 当遍历到这个位置时,直接输出
*/
public class LeetCode763 {
public List<Integer> partitionLabels(String s) {
List<Integer> res = new ArrayList<>();
int[] dic = new int[26];
//统计最后出现的位置
for(int i = 0;i < s.length();i++){
dic[s.charAt(i) - 'a'] = i;
}
int left = 0;
int right = 0;
for(int i = 0;i < s.length();i++){
right = Math.max(right, dic[s.charAt(i) - 'a']);
if(i == right){
res.add(right - left + 1);
left = right + 1;
}
}
return res;
}
}