力扣 228:汇总区间

题目描述:

  给定一个无重复的有序整数数组 nums;

  返回恰好覆盖数组中所有数字的最小有序区间范围列表。也就是说nums中的每个

  元素都恰好被包含在某个区间内,并且不存在nums中的某个元素不属于某个范围内

  输出格式要求:

    • “a->b”,如果 a!=b
    • "a",如果 a==b 

示例:

  输入:nums=[0,1,2,4,5,7]

  输出:['0->2','4->5','7']

  输入:nums=[0,2,3,4,6,8,9]

  输出:['0','2->4','6','8->9']

综合解法(javascript):

console.log('汇总区间');
var nums=[0,1,2,4,5,7];
// var nums=[0,2,3,4,6,8,9];
var summary_result=[];
function summaryDeal(nums){
    if(nums.length===0) return;
    var start_index=0,end_index=0;
    for(let index=1;index<=nums.length;index++){        
        if(nums[index]==nums[start_index]+(index-start_index)){
            end_index=index;
            if(index==nums.length-1){
                let str =String(nums[start_index])+'->'+String(nums[end_index]);
                summary_result.push(str);
                return;
            }            
        }else{
            let str =end_index>start_index?String(nums[start_index])+'->'+String(nums[end_index]):String(nums[start_index]);
            summary_result.push(str);
            start_index=index;
        }        
    }
    return;
}
console.time('a');
summaryDeal(nums);
console.timeEnd('a'); //0.33
console.log('元数组:',nums);
console.log('汇总区间结果:',summary_result);

总结:

   针对汇总区间的解法,简单易解;这里就解题中需要注意的事项做个记录:

    1. 算法中使用到的起始,末尾位置的标记;
    2. 数组尾部元素的处理;由分析可得数组尾部包含两种情况
      • 尾部属于单个元素即不和前面元素构成一个范围
      • 尾部元素属于单个范围   

  只要上述两种情况处理好,本题就结束了。

版权声明:本文为博主原创文章,如需转载,请标明出处

原文地址:https://www.cnblogs.com/gamecc666/p/14660331.html