|
4 | 4 | import java.util.List;
|
5 | 5 |
|
6 | 6 | /**
|
| 7 | + * 163. Missing Ranges |
7 | 8 | * Given a sorted integer array where the range of elements are in the inclusive range [lower, upper], return its missing ranges.
|
8 |
| - * <p> |
9 | 9 | * For example, given [0, 1, 3, 50, 75], lower = 0 and upper = 99, return ["2", "4->49", "51->74", "76->99"].
|
10 | 10 | */
|
11 | 11 | public class _163 {
|
12 | 12 |
|
13 | 13 | public List<String> findMissingRanges(int[] nums, int lower, int upper) {
|
14 |
| - List<String> res = new ArrayList<String>(); |
15 |
| - |
16 |
| - // the next number we need to find |
17 |
| - long next = lower; |
18 |
| - long longUpper = (long) upper; |
19 |
| - if (nums.length == 0) { |
20 |
| - res.add(getRange(lower, longUpper)); |
21 |
| - return res; |
22 |
| - } else if (nums.length == 1 && nums[0] == -2147483648 && lower == -2147483648 && upper == 2147483647) { |
23 |
| - res.add(getRange(lower + 1, longUpper)); |
24 |
| - return res; |
25 |
| - } |
26 |
| - |
27 |
| - for (int i = 0; i < nums.length; i++) { |
28 |
| - // not within the range yet |
29 |
| - if (nums[i] < next) continue; |
30 |
| - |
31 |
| - // continue to find the next one |
32 |
| - if (nums[i] == next) { |
33 |
| - next++; |
34 |
| - continue; |
| 14 | + List<String> result = new ArrayList<>(); |
| 15 | + long low = (long) lower - 1; |
| 16 | + long up = 0; |
| 17 | + for (int i = 0; i <= nums.length; i++) { |
| 18 | + if (i == nums.length) { |
| 19 | + up = (long) upper + 1; |
| 20 | + } else { |
| 21 | + up = nums[i]; |
35 | 22 | }
|
36 |
| - |
37 |
| - // get the missing range string format |
38 |
| - res.add(getRange(next, nums[i] - 1)); |
39 |
| - |
40 |
| - // now we need to find the next number |
41 |
| - if (nums[i] < Integer.MAX_VALUE) next = nums[i] + 1; |
42 |
| - else break; |
| 23 | + if (up == low + 2) { |
| 24 | + result.add(low + 1 + ""); |
| 25 | + } else if (up > low + 2) { |
| 26 | + result.add((low + 1) + "->" + (up - 1)); |
| 27 | + } |
| 28 | + low = up; |
43 | 29 | }
|
44 |
| - |
45 |
| - // do a final check |
46 |
| - if (next > Integer.MIN_VALUE && next <= longUpper && longUpper < Integer.MAX_VALUE) |
47 |
| - res.add(getRange(next, longUpper)); |
48 |
| - if (next == Integer.MIN_VALUE && longUpper == Integer.MAX_VALUE && nums.length == 0) |
49 |
| - res.add(getRange(next, longUpper)); |
50 |
| - |
51 |
| - return res; |
52 |
| - } |
53 |
| - |
54 |
| - String getRange(long n1, long n2) { |
55 |
| - return (n1 == n2) ? String.valueOf(n1) : String.format("%d->%d", n1, n2); |
| 30 | + return result; |
56 | 31 | }
|
57 | 32 | }
|
0 commit comments