Top 150 · 区间(4 题)
区间合并、插入与贪心选点。
本模块共 4 题,属于 LeetCode 面试经典 150 题 系列。
228. 汇总区间
难度: 简单
力扣做题思路
代码
class Solution {
public List<String> summaryRanges(int[] nums) {
int i = 0;
int j = 0;
List<String> ans = new ArrayList<>();
while (j < nums.length) {
while (j + 1 < nums.length && nums[j + 1] == nums[j] + 1) {
j++;
}
String temp;
if (i == j) {
temp = Integer.toString(nums[i]);
} else {
temp = Integer.toString(nums[i])
+ "->"
+ Integer.toString(nums[j]);
}
ans.add(temp);
j++;
i = j;
}
return ans;
}
}复杂度
- 时间:
- 空间:
备注
56. 合并区间
难度: 中等
力扣做题思路
代码
class Solution {
public int[][] merge(int[][] intervals) {
ArrayList<int[]> ans = new ArrayList();
int n = intervals.length;
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[0],o2[0]);
}
});
int[] cur = new int[2];
cur[0] = intervals[0][0];
cur[1] = intervals[0][1];
for (int i = 1; i < n; i++) {
if(cur[1] >= intervals[i][0]){
//merge
cur[1] = Math.max(intervals[i][1],cur[1]);
}else{
ans.add(cur);
cur = new int[2];
cur[0] = intervals[i][0];
cur[1] = intervals[i][1];
}
}
ans.add(cur);
return ans.toArray(new int[ans.size()][]);
}
}复杂度
- 时间:
- 空间:
备注
57. 插入区间
难度: 中等
力扣做题思路
代码
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
ArrayList<int[]> ans = new ArrayList();
int a = newInterval[0];
int b = newInterval[1];
int i =0;
int n = intervals.length;
boolean flag = true;
while(i<n){
if(intervals[i][1]<a){
ans.add(intervals[i]);
i++;
}else if(intervals[i][0]>b){
if(flag){
ans.add(new int[]{a,b});
flag = false;
}
ans.add(intervals[i]);
i++;
}else{
a = Math.min(a, intervals[i][0]);
b = Math.max(b, intervals[i][1]);
i++;
}
}
if(flag){
ans.add(new int[]{a,b});
}
return ans.toArray(new int[ans.size()][]);
}
}复杂度
- 时间:
- 空间:
备注
452. 用最少数量的箭引爆气球
难度: 中等
力扣做题思路
代码
class Solution {
public int findMinArrowShots(int[][] points) {
if(points.length == 1)return 1;
Arrays.sort(points, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[0],o2[0]);
}
});
int ans =1;
int right = points[0][1];
for (int i = 1; i < points.length; i++) {
if(points[i][0] > right){
ans++;
right = points[i][1];
}else{
right = Math.min(right,points[i][1]);
}
}
return ans;
}
}复杂度
- 时间:
- 空间:
