leedcode每日一題:228. 彙總區間
阿新 • • 發佈:2021-01-12
一、題解
給定一個無重複元素的有序整數陣列 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”
二、題解
一次遍歷
時間複雜度:O(n)
空間複雜度:O(1)
注意:1.注意陣列首或者尾特殊處理,
2.注意判斷條件最好寫成減的形式nums[i]!=nums[i+1]-1,防止在特殊用例[-2147483648,-2147483647,2147483647]上溢位
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> res = new ArrayList<>();
int n = nums.length;
int num = 1;
for(int i=0;i<n;i++){
if(i==n-1||nums[i]!=nums[i+1]-1){
String temp;
if(num>1)
temp = nums[i-num+1] + "->" + nums[i];
else
temp = nums[i]+"" ;
res.add(temp);
num = 1;
}else
num++;
}
return res;
}
}
或者使用StringBuffer
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> res = new ArrayList<>();
StringBuffer sb = new StringBuffer();
int n = nums.length;
int num = 1;
for(int i=0;i<n;i++){
if(i==n-1||nums[i]!=nums[i+1]-1){
if(num>1)
sb.append(nums[i-num+1] + "->" + nums[i]);
else
sb.append(nums[i]+"");
res.add(sb.toString());
sb.setLength(0);
num = 1;
}else
num++;
}
return res;
}
}