代码随想录算法训练营Day30
最少数量的箭引爆气球
这里的重点在更新最小右边界
class Solution {
public int findMinArrowShots(int[][] points) {
if(points.length==0){
return 0;
}
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
int count = 1;
for (int i = 1; i < points.length; i++) {
if (points[i][0] > points[i - 1][1]) { // 气球i和气球i-1不挨着,注意这里不是>=
count++;
} else {
points[i][1] = Math.min(points[i][1], points[i - 1][1]); // 更新重叠气球最小右边界
}
}
return count;
}
}
无重叠区间
类似于上题
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
int result = 0;
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
for(int i = 1;i<intervals.length;i++){
if(intervals[i][0]<intervals[i-1][1]){
result++;
intervals[i][1] = Math.min(intervals[i][1],intervals[i-1][1]);
}
}
return result;
}
}
划分字母区间
同样的字母只能出现在一个区间中,不能出现在两个区间中
如果包含a,则需要包含所有的a,创建最远位置的数组
public class Solution {
public List<Integer> partitionLabels(String S) {
int[] lastIndex = new int[26]; // 记录每个字符最后出现的位置
for (int i = 0; i < S.length(); i++) {
lastIndex[S.charAt(i) - 'a'] = i;
}
List<Integer> result = new ArrayList<>();
int left = 0, right = 0;
for (int i = 0; i < S.length(); i++) {
right = Math.max(right, lastIndex[S.charAt(i) - 'a']);
if (i == right) {
result.add(right - left + 1);
left = i + 1;
}
}
return result;
}
}

浙公网安备 33010602011771号