Leetcode659.分割陣列為連續子序列
阿新 • • 發佈:2020-12-04
題目: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; } }