You are given an integer array sorted in ascending order (may contain duplicates), you need to split them into several subsequences, where each subsequences consist of at least 3 consecutive integers. Return whether you can make such a split.
Example 1:
Input: [1,2,3,3,4,5] Output: True Explanation: You can split them into two consecutive subsequences : 1, 2, 3 3, 4, 5
Example 2:
Input: [1,2,3,3,4,4,5,5] Output: True Explanation: You can split them into two consecutive subsequences : 1, 2, 3, 4, 5 3, 4, 5
Example 3:
Input: [1,2,3,4,4,5] Output: False
Note:
- The length of the input is in range of [1, 10000]
思路:O(N)
* O(N)就是遍历几遍啦,遍历的时候考虑每个数的去向,(这是个套路??)
* 一个数要么加到一个已经形成的队列里,要么新开辟一个队列
* (如果再加到已经形成的队列的element的个数超过3个,就一定能形成新的队列)
* (而如果少于3个,就只能加到原有队列,所以是优先加到已经形成的队列)
* 如果都不行就说明不能形成,return false
*
* 前提是数组是有序的
* O(N)就是遍历几遍啦,遍历的时候考虑每个数的去向,(这是个套路??)
* 一个数要么加到一个已经形成的队列里,要么新开辟一个队列
* (如果再加到已经形成的队列的element的个数超过3个,就一定能形成新的队列)
* (而如果少于3个,就只能加到原有队列,所以是优先加到已经形成的队列)
* 如果都不行就说明不能形成,return false
*
* 前提是数组是有序的
public class Solution {
public boolean isPossible(int[] nums) {
Map<Integer, Integer> unused_freq = new HashMap<Integer, Integer>(), need_freq = new HashMap<Integer, Integer>();
for(int i : nums) unused_freq.put(i, unused_freq.containsKey(i)?1+unused_freq.get(i):1);
for(int i : nums) {
if(unused_freq.get(i) == 0) continue; // 这个数用完了
if(need_freq.containsKey(i) && need_freq.get(i)>0) {
// 加到已经有的队列
need_freq.put(i, need_freq.get(i)-1);
need_freq.put(i+1, need_freq.containsKey(i+1)?need_freq.get(i+1)+1:1);
unused_freq.put(i, unused_freq.get(i)-1);
} else if(unused_freq.containsKey(i+1) && unused_freq.get(i+1)>0
&& unused_freq.containsKey(i+2) && unused_freq.get(i+2)>0) {
// 加到新的队列
need_freq.put(i+3, need_freq.containsKey(i+3)?1+need_freq.get(i+3):1);
unused_freq.put(i, unused_freq.get(i)-1);
unused_freq.put(i+1, unused_freq.get(i+1)-1);
unused_freq.put(i+2, unused_freq.get(i+2)-1);
} else {
// 这个数无处容身
return false;
}
}
return true;
}
}
遍历到某个位置的时候不能拖到后面处理,要及时出击 ,把当前处理干净
不然留到后面是无法处理的