1. 程式人生 > >Leetcode 659.分割數組為連續子序列

Leetcode 659.分割數組為連續子序列

div round urn extend oid map 輸出 ima 長度

分割數組為連續子序列

輸入一個按升序排序的整數數組(可能包含重復數字),你需要將它們分割成幾個子序列,其中每個子序列至少包含三個連續整數。返回你是否能做出這樣的分割?

示例 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. 輸入的數組長度範圍為 [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 }

技術分享圖片

Leetcode 659.分割數組為連續子序列