Advertisement
1988coder

163-Missing Ranges

Mar 23rd, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.70 KB | None | 0 0
  1.  
  2. // LeetCode URL: https://leetcode.com/problems/missing-ranges/
  3.  
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.List;
  7.  
  8. /**
  9.  * This soultion will work if the numbers in nums array are guaranteed to be in
  10.  * [lower, upper] range.
  11.  *
  12.  * Time Complexity: O(N)
  13.  *
  14.  * Space Complexity: O(N)
  15.  *
  16.  * N = Length of nums array.
  17.  */
  18. class Solution1 {
  19.     public List<String> findMissingRanges(int[] nums, int lower, int upper) {
  20.         List<String> result = new ArrayList<>();
  21.         if (lower > upper) {
  22.             return result;
  23.         }
  24.         if (nums == null || nums.length == 0) {
  25.             result.add(getRangeStr(lower, upper));
  26.             return result;
  27.         }
  28.         if (lower == upper) {
  29.             int idx = Arrays.binarySearch(nums, lower);
  30.             if (idx < 0) {
  31.                 result.add(getRangeStr(lower, upper));
  32.             }
  33.             return result;
  34.         }
  35.  
  36.         int nextStart = lower;
  37.  
  38.         for (int n : nums) {
  39.             // Skip the current number if it is less than the next starting number
  40.             if (n < nextStart) {
  41.                 continue;
  42.             }
  43.  
  44.             // Current number is part of the range, increment the missing range starting
  45.             // number.
  46.             if (n == nextStart) {
  47.                 if (n == Integer.MAX_VALUE) {
  48.                     return result;
  49.                 }
  50.                 nextStart++;
  51.                 continue;
  52.             }
  53.  
  54.             result.add(getRangeStr(nextStart, n - 1));
  55.  
  56.             if (n == Integer.MAX_VALUE) {
  57.                 return result;
  58.             }
  59.  
  60.             nextStart = n + 1;
  61.         }
  62.  
  63.         // Create the range for the numbers missing between the last number in nums
  64.         // array and upper limit.
  65.         if (nextStart <= upper) {
  66.             result.add(getRangeStr(nextStart, upper));
  67.         }
  68.  
  69.         return result;
  70.     }
  71.  
  72.     private String getRangeStr(int s, int e) {
  73.         if (s == e) {
  74.             return String.valueOf(s);
  75.         }
  76.         return s + "->" + e;
  77.     }
  78. }
  79.  
  80. /**
  81.  * This soultion will work if the numbers in nums array are in
  82.  * [Integer.MIN_VALUE, Integer.MAX_VALUE] range but may be out of [lower, upper]
  83.  * range.
  84.  *
  85.  * Time Complexity: O(N)
  86.  *
  87.  * Space Complexity: O(N)
  88.  *
  89.  * N = Length of nums array.
  90.  */
  91. class Solution2 {
  92.     public List<String> findMissingRanges(int[] nums, int lower, int upper) {
  93.         List<String> result = new ArrayList<>();
  94.         if (lower > upper) {
  95.             return result;
  96.         }
  97.         if (nums == null || nums.length == 0) {
  98.             result.add(getRangeStr(lower, upper));
  99.             return result;
  100.         }
  101.         if (lower == upper) {
  102.             int idx = Arrays.binarySearch(nums, lower);
  103.             if (idx < 0) {
  104.                 result.add(getRangeStr(lower, upper));
  105.             }
  106.             return result;
  107.         }
  108.  
  109.         int nextStart = lower;
  110.  
  111.         for (int n : nums) {
  112.             if (n < nextStart) {
  113.                 continue;
  114.             }
  115.             if (n == nextStart) {
  116.                 if (n == upper) {
  117.                     return result;
  118.                 }
  119.                 nextStart++;
  120.                 continue;
  121.             }
  122.  
  123.             result.add(getRangeStr(nextStart, Math.min(upper, n - 1)));
  124.  
  125.             if (upper <= n) {
  126.                 return result;
  127.             }
  128.             nextStart = n + 1;
  129.         }
  130.  
  131.         if (nextStart <= upper) {
  132.             result.add(getRangeStr(nextStart, upper));
  133.         }
  134.  
  135.         return result;
  136.     }
  137.  
  138.     private String getRangeStr(int s, int e) {
  139.         if (s == e) {
  140.             return String.valueOf(s);
  141.         }
  142.         return s + "->" + e;
  143.     }
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement