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