【Leetcode】228. Summary Ranges

题目地址:

https://leetcode.com/problems/summary-ranges/

给定一个严格升序数组 A A A,返回其分成若干区间的所有区间。例如对于 ( 0 , 1 , 2 , 4 , 5 , 7 ) (0,1,2,4,5,7) (0,1,2,4,5,7),它可以分成 [ 0 , 2 ] , [ 4 , 5 ] , [ 7 ] [0,2],[4,5],[7] [0,2],[4,5],[7]三个区间。返回的时候要求返回 [ " 0 → 2 " , " 4 → 5 " , " 7 " ] ["0\to 2","4\to 5","7"] ["02","45","7"]这样的字符串形式。

思路是双指针。当遍历到一个位置的时候,先判断其是否自成一个区间,如果是,则加入答案,然后从后一个数继续遍历;否则开一个指针向后拓展,将所得区间加入答案后,从后一个数继续遍历。代码如下:

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public List<String> summaryRanges(int[] nums) {
        List<String> res = new ArrayList<>();
        for (int j = 0, i = 0; i < nums.length;) {
            j = i + 1;
            // 自成一个区间,要么i是最后一个数,要么后面的数接不上去
            if (j == nums.length || nums[j - 1] + 1 != nums[j]) {
                res.add(String.valueOf(nums[i]));
                i = j;
                continue;
            }
            // 否则说明能接上去,看能走多远
            while (j < nums.length && nums[j - 1] + 1 == nums[j]) {
                j++;
            }
            
            res.add(nums[i] + "->" + nums[j - 1]);
            i = j;
        }
        
        
        return res;
    }
}

时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页