1. 程式人生 > 其它 >leedcode每日一題:228. 彙總區間

leedcode每日一題:228. 彙總區間

技術標籤:刷題筆記leetcode陣列

一、題解

給定一個無重複元素的有序整數陣列 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;
    }
}