其他分享
首页 > 其他分享> > 307,汇总区间

307,汇总区间

作者:互联网

给定一个无重复元素的有序整数数组,返回数组区间范围的汇总。

示例 1:

输入: [0,1,2,4,5,7]
输出: ["0->2","4->5","7"]
解释: 0,1,2 可组成一个连续的区间; 4,5 可组成一个连续的区间。

示例 2:

输入: [0,2,3,4,6,8,9]
输出: ["0","2->4","6","8->9"]
解释: 2,3,4 可组成一个连续的区间; 8,9 可组成一个连续的区间。

答案:

 1public List<String> summaryRanges(int[] nums) {
2    List<String> list = new ArrayList();
3    if (nums.length == 1) {
4        list.add(nums[0] + "");
5        return list;
6    }
7    for (int i = 0; i < nums.length; i++) {
8        int a = nums[i];
9        while (i + 1 < nums.length && (nums[i + 1] - nums[i]) == 1) {
10            i++;
11        }
12        if (a != nums[i]) {
13            list.add(a + "->" + nums[i]);
14        } else {
15            list.add(a + "");
16        }
17    }
18    return list;
19}

解析:

注意数组是排过序的,只需要计算当前值和后面的是否相差1即可判断是否属于同一区间。下面再来看一种写法

 1public List<String> summaryRanges(int[] nums) {
2    List<String> list = new ArrayList<>();
3    for (int i = 0, len = nums.length, k; i < len; i = k + 1) {
4        k = help(nums, i, len);
5        if (i != k)
6            list.add("" + nums[i] + "->" + nums[k]);
7        else
8            list.add("" + nums[i]);
9    }
10    return list;
11}
12
13private int help(int[] nums, int left, int right) {
14    while (left + 1 < right) {
15        int mid = (left + right) / 2;
16        if (nums[mid] - nums[left] == mid - left)
17            left = mid;
18        else
19            right = mid;
20    }
21    return left;
22}

这种写法其实比第一种更经典,理解起来可能也会更难一些,注意help函数中的参数right每次都是传入数组的长度len,这个有点类似于二分法查找,最重要的是在第16行,如果成立,说明数组下标从left到mid都可以划分为同一区间,否则缩短right的范围。

标签:nums,int,汇总,list,mid,307,add,区间,left
来源: https://blog.51cto.com/u_4774266/2902544