1. 程式人生 > 實用技巧 >Leetcode659.分割陣列為連續子序列

Leetcode659.分割陣列為連續子序列

題目:https://leetcode-cn.com/problems/split-array-into-consecutive-subsequences/

題意:將一個排序好的陣列分割成多個長度不小於3的連續子序列,例如:輸入[1,2,2,3,3,4],有“1,2,3”、“2,3,4”,可以分割;輸入[1,2,3,5,6,6],有“1,2,3,4,5,6”,“6”,不能分割。

官方題解:分割陣列為連續子序列

思路:雜湊表+最小堆。只要知道序列的最後一個數值和子序列長度就可以確定子序列。因此用雜湊表儲存最後一個元素和子序列長度。但可能出現多個以相同數字為結尾,如“5,5,5,5,5,5”,那麼雜湊表將無法直接使用。將雜湊表的value儲存為優先佇列,佇列元素代表長度,因為,數值x需要尋找以x-1為結尾的子序列,當出現多個x-1為結尾的子序列時,那麼應該優先考慮較短的那個,因為題目要求長度至少為3。

程式碼:

class Solution {
    public boolean isPossible(int[] nums) {
        HashMap<Integer, PriorityQueue<Integer>> map = new HashMap<>();
        for(int n : nums){
            if(!map.containsKey(n)){
                map.put(n, new PriorityQueue<>());
            }
            
if(map.containsKey(n-1)){ int t = map.get(n-1).poll(); if(map.get(n-1).isEmpty()){ map.remove(n-1); } map.get(n).offer(t+1); }else{ map.get(n).offer(1); } } for
(Map.Entry<Integer, PriorityQueue<Integer>> s : map.entrySet()){ if(s.getValue().peek() < 3){ return false; } } return true; } }