虽然AC了,但这题是有难度的。如果你想remove一个,在确认重合(intervals[i][0] < max)后,我们应该留下 较小的一端,放弃最大的一端。比如,当[1,2]和[1,3]重合时,我们抛弃后者,因为2 < 3。如果没发生重合,max也要正常更新。
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a,b) -> {
return a[0] - b[0];
});
int count = 0, max = intervals[0][1];
for(int i = 1; i < intervals.length; ++i){
if(intervals[i][0] < max){
// overlapping exists
max = Math.min(max, intervals[i][1]);
++count;
}else{
max = intervals[i][1];
}
}
return count;
}
}
这是我第一次看到这个题的做法。因为我一看到字母就想到哈希表,所以这个解法对我而言更直观一点,也根据题意更自然能想到。先过一遍string,确定每个字母出现几次,记录在哈希表中。如果字母没出现,统一设为-1(设成什么负数都行)。之后,再次从头遍历string。如果发现任何一个字母,对应相减。同时,用一个set记录沿途遇到的元素。如果一个元素被减没了(arr[index] == 0),那么将它从set里移除。如果set里没元素了,说明第一个,以及沿途经过的字母都剪没了。那么,我们就应该分为一组。
class Solution {
public List<Integer> partitionLabels(String s) {
int[] arr = new int[26];
List<Integer> list = new ArrayList<>();
Set<Character> set = new HashSet<>();
int count = 0;
for(int i = 0; i < s.length(); ++i){
++arr[s.charAt(i) - 97];
}
for(int i = 0; i < arr.length; ++i){
if(arr[i] == 0) arr[i] = -1;
}
for(int i = 0; i < s.length(); ++i){
int index = s.charAt(i) - 97;
--arr[index];
set.add(s.charAt(i));
++count;
if(arr[index] == 0){
set.remove(s.charAt(i));
if(set.isEmpty()){
list.add(count);
count = 0;
}
}
}
return list;
}
}
这题很经典了,被TikTok真正的考到过。逻辑不难,主要是格式至少用Java很难写。背背格式就好。
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> {
return a[0] - b[0];
});
List<int[]> res = new ArrayList<>();
int min = intervals[0][0], max = intervals[0][1];
for(int i = 1; i < intervals.length; ++i){
if(intervals[i][0] > max){
int[] tmp = {min, max};
res.add(tmp);
min = intervals[i][0];
max = intervals[i][1];
}
if(intervals[i][1] > max){
max = intervals[i][1];
}
}
int[] tmp = {min, max};
res.add(tmp);
return res.toArray(new int[res.size()][]);
}
}

被折叠的 条评论
为什么被折叠?



