Leetcode 659.分割数组为连续子序列
分割数组为连续子序列
输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数。返回你是否能做出这样的分割?
示例 1:
输入: [1,2,3,3,4,5]
输出: True
解释:
你可以分割出这样两个连续子序列 :
1, 2, 3
3, 4, 5
示例 2:
输入: [1,2,3,3,4,4,5,5]
输出: True
解释:
你可以分割出这样两个连续子序列 :
1, 2, 3, 4, 5
3, 4, 5
示例 3:
输入: [1,2,3,4,4,5]
输出: False
提示:
- 输入的数组长度范围为 [1, 10000]
1 class Solution { 2 public boolean isPossible(int[] nums) { 3 Counter count = new Counter(); 4 Counter tails = new Counter(); 5 for (int x: nums) count.add(x, 1); 6 7 for (int x: nums) { 8 if (count.get(x) == 0) { 9 continue; 10 } else if (tails.get(x) > 0) { 11 tails.add(x, -1); 12 tails.add(x+1, 1); 13 } else if (count.get(x+1) > 0 && count.get(x+2) > 0) { 14 count.add(x+1, -1); 15 count.add(x+2, -1); 16 tails.add(x+3, 1); 17 } else { 18 return false; 19 } 20 count.add(x, -1); 21 } 22 return true; 23 } 24 } 25 26 class Counter extends HashMap<Integer, Integer> { 27 public int get(int k) { 28 return containsKey(k) ? super.get(k) : 0; 29 } 30 31 public void add(int k, int v) { 32 put(k, get(k) + v); 33 } 34 }