给定一个 无重复元素 的 有序 整数数组 nums 。
返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
列表中的每个区间范围 [a,b] 应该按如下格式输出:
“a->b” ,如果 a != b
“a” ,如果 a == b
示例 1:
输入:nums = [0,1,2,4,5,7]
输出:[“0->2”,“4->5”,“7”]
解释:区间范围是:
[0,2] --> “0->2”
[4,5] --> “4->5”
[7,7] --> “7”
示例 2:
输入:nums = [0,2,3,4,6,8,9]
输出:[“0”,“2->4”,“6”,“8->9”]
解释:区间范围是:
[0,0] --> “0”
[2,4] --> “2->4”
[6,6] --> “6”
[8,9] --> “8->9”
分组循环:
适用于区间处理,数组会被分割成若干段,且每一段的判断/处理逻辑是一样的。
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> ret = new ArrayList<String>();
int i = 0;
int n = nums.length;
while (i < n) {
int low = i;
i++; //先增加1
while (i < n && nums[i] == nums[i - 1] + 1) {
i++;
}
int high = i - 1;
StringBuffer temp = new StringBuffer(Integer.toString(nums[low]));
if (low < high) {
temp.append("->");
temp.append(Integer.toString(nums[high]));
}
ret.add(temp.toString());
}
return ret;
}
}
- 合并区间
分析:
区间不一定是递增排列的,所以按照左边界排序。(学习list排序)
注意必须要用r记录,因为数组排序是按照左边界排列大小,i+1的右边界可能比i小
class Solution {
public int[][] merge(int[][] intervals) {
// 先按照区间起始位置排序
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] interval1, int[] interval2) {
return interval1[0] - interval2[0];
}
});
List<int[]> res = new ArrayList<>();
int i = 0, n = intervals.length;
while(i < n){
int l = intervals[i][0];
int r = intervals[i][1];
//注意必须要用r记录,因为数组排序是按照左边界排列大小,i+1的右边界可能比i小
while(i < n - 1 && r >= intervals[i+1][0]){
r = Math.max(r, intervals[i+1][1]);
i++;
}
int[] temp = new int[]{l,r};
res.add(temp);
i++;
}
return res.toArray(new int[res.size()][2]);
}
}
- 插入区间
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> res = new ArrayList<>();
int i = 0, n = intervals.length;
int pos = 0;
while(i < n){
int l = intervals[i][0];
int r = intervals[i][1];
if(r < newInterval[0]){ //在新区间左侧
res.add(intervals[i]);
pos++;
}else if(l > newInterval[1]){ //在新区间右侧
res.add(intervals[i]);
}else{
newInterval[0] = Math.min(newInterval[0], l);
newInterval[1] = Math.max(newInterval[1], r);
}
i++;
}
res.add(pos, newInterval);
return res.toArray(new int[res.size()][2]);
}
}