Given an array nums
sorted in ascending order, return true
if and only if you can split it into 1 or more subsequences such that each subsequence consists of consecutive integers and has length at least 3.
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
Constraints:
1 <= nums.length <= 10000
------------------------------------------------------------------------
- If there is some subsequence named as A with length >= 3, try to arrange current number after A in higher priority.
- If there isn't such a subsequence, try to create a consecutive subsequence with length
- If 1 and 2 both fail, return False
from collections import defaultdict, Counter
class Solution:
def isPossible(self, nums) -> bool:
left = Counter(nums)
last = defaultdict(int)
for x in nums:
if (left[x] > 0):
if (last[x-1] > 0):
left[x] -= 1 #bug1
last[x-1] -= 1
last[x] += 1
elif (left[x+1] > 0 and left[x+2] > 0):
left[x],left[x+1],left[x+2] = left[x]-1,left[x+1]-1,left[x+2]-1
last[x+2] += 1
else:
return False
return True
Similar problem:
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's hand can't be rearranged into groups of 4.
Constraints:
1 <= hand.length <= 10000
0 <= hand[i] <= 10^9
1 <= W <= hand.length
Note: This question is the same as 1296: https://leetcode.com/problems/divide-array-in-sets-of-k-consecutive-numbers/
--------------------------------------------
from collections import Counter
class Solution:
def isNStraightHand(self, hand, W) -> bool:
left = Counter(hand)
keys = sorted(list(left.keys()))
for first in keys:
if (left[first] > 0):
base = left[first]
for i in range(W):
if left[first+i] < base:
return False
for i in range(W):
left[first+i] -= base
return True
s = Solution()
print(s.isNStraightHand(hand = [1,2,3,6,2,3,4,7,8], W = 3))
print(s.isNStraightHand(hand = [1,2,3,4,5], W = 4))