• 163. Missing Ranges


    这个题做了很久。

    一开始没审题,以为数组可以是任意数字,测了几个test case感觉答案是错的,才发现lower-upper规定了数组内数字的范围。。这样简单一些。。

    我是固定右边,移动左边,进行添加。。

    其实不能算做出来,错了无数次,各种edge case完全想不到,改了又改改出个答案来。。

    public class Solution {
        public List<String> findMissingRanges(int[] nums, int lower, int upper) 
        {
            List<String> res = new ArrayList<String>();
            if(nums.length == 0)
            {
                add(res,lower,upper);
                return res;
            }
            if(nums.length == 1)
            {
                if(nums[0] != Integer.MIN_VALUE)
                add(res,lower,nums[0]-1);
                if(nums[0] != Integer.MAX_VALUE)
                add(res,nums[0]+1,upper);
                return res;
            }
            
            if(lower == upper)
            {
                for(int i = 0; i < nums.length;i++)
                {
                    if(nums[i] == lower) return res;
                    else if(nums[i] > lower)
                    {
                        add(res,lower,upper);
                        return res;
                    }
                }
            }
            else
            {
                
                int l = 0; 
                int r = nums.length-1;
                while(l < r)
                {
                    while(l < r && nums[l] < lower) l++;
                    if(nums[l] != Integer.MIN_VALUE)
                    add(res,lower,nums[l]-1);
                    lower = nums[l];
                
                    
                    while(l < r && nums[l]+1 == nums[l+1]) l++;
                    if(l >= r) break;
                    add(res,nums[l]+1,nums[l+1]-1);
                    lower = nums[l+1];
                    
                    
                }
                if(nums[nums.length-1] != Integer.MAX_VALUE)
                add(res,nums[nums.length-1]+1,upper);
            }
            
            
            
            return res;
            
            
        }
        
        public void add(List<String> res, int a, int b)
        {
            if(a > b) return;
            else if(a == b) res.add("" + a);
            else
            {
                res.add("" + a + "->" + b);
            }
        }
    }
    

    实在是不能忍,重新做了一下,思路没变,代码好看多了。

    public class Solution {
        public List<String> findMissingRanges(int[] nums, int lower, int upper) 
        {
           List<String> res = new ArrayList<String>();
           if(nums.length == 0) 
           {
               add(res,lower,upper);
               return res;
           }
           for(int i = 0; i < nums.length;)
           {
               if(nums[i] == lower)
               {
                   
                   i++;
                   if(i == nums.length) break;
                   lower++;
               }
               else
               {
                   add(res,lower,nums[i]-1);
                   lower = nums[i];
                   
               }
           }
            
            if(lower != upper)
            add(res,lower+1,upper);
            return res;
            
        }
        
        public void add(List<String> res, int a, int b)
        {
            if(a > b) return;
            else if(a == b) res.add("" + a);
            else
            {
                res.add("" + a + "->" + b);
            }
        }
    }
    

    选值如果通过 upper - lower = Rindex - Lindex来跳过段数,应该会减少很多时间。。

    可惜我不会做。

  • 相关阅读:
    [NC13331]城市网络
    Codeforces Round #638 (Div. 2)
    牛客练习赛62
    “科大讯飞杯”第18届上海大学程序设计联赛春季赛暨高校网络友谊赛
    Codeforces Round #635 (Div. 2)
    Codeforces Round #631 (Div. 2)
    牛客每日一题
    Codeforces Round #627 (Div. 3)
    MySQL查看建表语句
    Oracle的number数据类型
  • 原文地址:https://www.cnblogs.com/reboot329/p/5971927.html
Copyright © 2020-2023  润新知