题目

结果

代码
虽然通过了,但我这种算法太繁琐了,有空再看看题解怎么做的吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| class Solution { public boolean isPossible(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); for (int num : nums) { map.put(num, map.getOrDefault(num, 0) + 1); }
boolean[] flag = new boolean[nums.length]; int count = 0; while (count != nums.length) { Deque<Integer> stack = new LinkedList<>(); for (int i = 0; i < nums.length; i++) { if (flag[i]) { continue; } if (stack.isEmpty()) { stack.push(nums[i]); flag[i] = true; count++; continue; } if (nums[i] == stack.peek()) { if (nums[i] == nums[nums.length - 1] || map.get(nums[i]) > map.get(nextNum(nums, i))) { break; } } else { if (nums[i] - 1 != stack.peek()) { break; } stack.push(nums[i]); flag[i] = true; count++; } } for (int num : stack) { map.put(num, map.get(num) - 1); } if (!judge(stack)) { return false; } } return true; }
private boolean judge(Deque<Integer> stack) { if (stack.size() < 3) { return false; } while (true) { int tmp = stack.pop(); if (stack.isEmpty()) { break; } if (tmp != stack.peek() + 1) { return false; } } return true; }
private int nextNum(int[] nums, int index) { for (int i = index + 1; i < nums.length; i++) { if (nums[i] != nums[index]) { return nums[i]; } } throw new RuntimeException("no way"); } }
|
复杂度
时间复杂度:O(n²)
空间复杂度:O(n)