1. 程式人生 > >LeetCode Hand of Straights

LeetCode Hand of Straights

Alice has a hand of cards, given as an array of integers.

Now she wants to rearrange the cards into groups so that each group is size W, and consists of W consecutive cards.

Return true if and only if she can.

Example 1:

Input: hand = [1,2,3,6,2,3,4,7,8], W = 3
Output: true
Explanation: Alice's hand
can be rearranged as [1,2,3],[2,3,4],[6,7,8].

Example 2:

Input: hand = [1,2,3,4,5], W = 4
Output: false
Explanation: Alice's hand can't be rearranged into groups of 4.

Note:

  1. 1 <= hand.length <= 10000
  2. 0 <= hand[i] <= 10^9
  3. 1 <= W <= hand.length

愛麗絲有一手(hand)由整數陣列給定的牌。 

現在她想把牌重新排列成組,使得每個組的大小都是 W

,且由 W 張連續的牌組成。

如果她可以完成分組就返回 true,否則返回 false

示例 1:

輸入:hand = [1,2,3,6,2,3,4,7,8], W = 3
輸出:true
解釋:愛麗絲的手牌可以被重新排列為 [1,2,3],[2,3,4],[6,7,8]

示例 2:

輸入:hand = [1,2,3,4,5], W = 4
輸出:false
解釋:愛麗絲的手牌無法被重新排列成幾個大小為 4 的組。

題解:給定一個數組,表示的是給的一副牌,其中有連續的和不連續之分。現在給定一個W值,驗證是否在給定的一副牌中,存在以W為個數的連續的一隊順子,如果存在,那麼就返回true;否則返回false。

這道題考慮用到兩個資料結構map和list。其中list來儲存給定陣列中的元素,並且經過過濾了的;map用來儲存給定元素及其出現的次數。首先,掃描一遍陣列,將list和map填滿,之後用Collections.sort(list)對list進行從小到大排序。排完序後,對list進行遍歷,以W為每個順子的大小,每次如果某個元素,可以組成順子,那麼就將該元素在map中的出現的次數減1;如果出現某個順子的某個元素的次數為0,那麼直接返回false。遍歷完成後,即可判斷是否該陣列可以組成長度為W的順子對。

public boolean isNStraightHand(int[] hand,int W)
	{
		int length = hand.length;
		if(length % W != 0)
			return false;
		ArrayList<Integer> list = new ArrayList<>();
		TreeMap<Integer,Integer> treeMap = new TreeMap<>();
		for(int temp : hand)
		{
			if(!treeMap.containsKey(temp))
			{
				list.add(temp);
				treeMap.put(temp,1);
			}
			else
				treeMap.put(temp,treeMap.get(temp) + 1);
		}
        Collections.sort(list);
		int i = 0;
		while(i < list.size())
		{
			int tmp = list.get(i);
			int offset = 0;
			while(offset < W)
			{
				Integer num = treeMap.get(tmp + offset);
				if(num == null || num < 1)
					return false;
				treeMap.put(tmp + offset,num - 1);
				offset++;
			}
			while(i < list.size() && treeMap.get(list.get(i)) == 0)
				i++;
		}
		return true;
	}