LeetCode Hand of Straights
阿新 • • 發佈:2018-12-09
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'shand
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'shand
can't be rearranged into groups of4
.
Note:
1 <= hand.length <= 10000
0 <= hand[i] <= 10^9
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;
}