go语言题解LeetCode228汇总区间示例详解

2022-12-31 09:54:09
目录
题目描述思路分析AC 代码

题目描述

原题链接>

228. 汇总区间

给定一个  无重复元素 的 有序 整数数组 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"
    

    示例 2:

    输入:nums = [0,2,3,4,6,8,9]
    输出:["0","2->4","6","8->9"]
    解释:区间范围是:
    [0,0] --> "0"
    [2,4] --> "2->4"
    [6,6] --> "6"
    [8,9] --> "8->9"
    

    提示:

    0 <= nums.length <= 20

    -2^31 <= nums[i] <= 2^31 - 1

      nums 中的所有值都 互不相同nums 按升序排列

      思路分析

      本题思路比较明晰,设立双指针,一前一后遍历数组,当遇到结果不是有序递增,即nums[j]+1>

      本题难点在于边界处理,因为涉及到j+1,遍历时只能遍历到n-1,最后一位需要依照相同的思路重新判断一遍,如果数组为空或者只有一个元素,循环语句也不好判断,因为无法与第二个元素相比较。有评论使用逃课方法,即在数组后额外安插一个整型最大值,但这样的方法如果数组原本最后一个元素是最大值-1时,会导致结果错误不能使用。

      AC>
      vector<string> summaryRanges(vector<int> &nums) {
      	vector<string> s;
      	if (nums.size() == 0)
      		return s;
      	if (nums.size() == 1) {
      		s.push_back(to_string(nums[0]));
      		return s;
      	}
      	int i = 0, j = 0, n = nums.size();
      	string t;
      	for (; j < n - 1; j++) {
      		if (nums[j] + 1 != nums[j + 1]) {
      			if (i == j)
      				s.push_back(to_string(nums[i]));
      			else
      				s.push_back(to_string(nums[i]) + "->" + to_string(nums[j]));
      			i = j + 1;
      		}
      	}
      	if (i == j)
      		s.push_back(to_string(nums[i]));
      	else
      		s.push_back(to_string(nums[i]) + "->" + to_string(nums[j]));
      	return s;
      }

      以上就是go语言题解LeetCode228汇总区间示例详解的详细内容,更多关于go语言汇总区间的资料请关注易采站长站其它相关文章!