算法题解-汇总区间

87 阅读2分钟

题目

给定一个无重复元素的有序整数数组 nums 。返回恰好覆盖数组中所有数字的最小有序区间范围列表 。也就是说,nums的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于nums的数字x。

输入: nums = [0,1,2,4,5,7]
输出: ["0->2","4->5","7"]

题解

第一种

我们在函数中首先声明一个空数组res用于存储所有的区间字符串,然后在声明一个变量start来表示当前区间的起始数字和一个end变量来表示当前区间的结束数字,最后声明一个len变量来记录当前区间的长度,接下来我们使用for循环遍历数组nums中的每一个元素,如果当前元素是连续区间中的数字,则更新end变量和len变量的值,如果当前元素不是连续区间中的数字,则将当前区间的字符串表示加入到res数组中,然后重新设置start变量和end变量以及len变量的值,如果当前区间的长度为1,则直接将start变量加入到res数组中,最后将存储所有区间的字符串res数组返回即可

var summaryRanges = function(nums) {
    let res = [];
    let start = nums[0];
    let end;
    let len = 1;
    for(let i=1;i<nums.length+1;i++){
      if(start+len==nums[i]){
        end = nums[i];
        len++;
      }else{
        if(len==1){
          res.push(start+'');
          start = nums[i];
          continue;
        }
        res.push(start+'->'+end);
        start = nums[i];
        len = 1;
      }
    }
    return res;
  };

第二种

我们首先在函数中声明一个空数组res,然后在数组末尾添加一个NaN非数字的值,这种操作是为了确保最后一个数字也能被处理,我们接下来使用两个嵌套的for循环来遍历数组中的数字,第一个循环从第一个数字开始,第二个循环从第二个数字开始,如果当前数字与前一个数字之差等于1,则继续循环,否则我们将当前数字与前一个数字之间的范围添加到res数组中,如果当前数字与前一个数字相等,则只将一个数字添加到res数组中,在循环过程中,每次找到一个范围后,将外层循环的索引值更新为内层循环的索引值减1,以便跳过已经处理过的数字,最后我们将res数组返回出去即可

var summaryRanges = function(nums) {
    let res = []
    nums.push(NaN);
    for(let i=0;i<nums.length-1;i++){
        for(let j=i+1;j<nums.length;j++){
            if(nums[j] - nums[j-1] == 1){
                continue;
            }else{
                res.push(nums[i] === nums[j-1] ? 
                `${nums[i]}` : `${nums[i]}->${nums[j-1]}`);
                i = j-1;
                break;
            }
        }
    }
    return res;
};

坚持努力,无惧未来!