菜鸡刷算法的一天,每天分享两题算法,大家有这个想法的,可以给我个关注,然后一起坚持每天的算法之旅。希望我们共同进步,一起加油。 LC 435. 无重叠区间 给定一个区间的集
LC
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
示例 1:
输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:
输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例 3:
输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
解题思路:按照结束坐标进行升序排列,判断下一个值的开始坐标是否小于这个值的结束坐标,若是就删除数量 + 1。
代码:
var eraseOverlapIntervals = function(intervals) {
intervals.sort((a,b) => {
return a[1] - b[1]
})
let res = 0;
let pos = intervals[0][1];
for(let i = 1; i < intervals.length; i++) {
if(intervals[i][0] < pos) {
res++;
} else {
pos = intervals[i][1];
}
}
return res;
};
LC
字符串 S
由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
示例:
输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
解题思路:创建一个存放各个单词的最晚出现的位置。然后再进行遍历,直到遍历到 遇见的单词中最晚出现的位置时,表示这就是一个片段。然后开始遍历下一个片段。
代码:
var partitionLabels = function(s) {
let hash = {}
for(let i = 0; i < s.length; i++) { //遍历字符串,将每个单词出现最晚的位置放进 hash 表中
hash[s[i]] = i;
}
let res = [];
let l = 0, r = 0;
for(let i = 0; i < s.length; i++) { //遍历字符串,将遍历到的单词中的最晚出现位置 赋给 r,当 r 等于遍历到的位置,就相当于这就是一个最小的一个片段,开始遍历下一个片段。
r = Math.max(r, hash[s[i]]);
if(r === i) {
res.push(r - l + 1);
l = i + 1;
}
}
return res;
};