LeetCode 659. Split Array into Consecutive Subsequences 贪心 坑 | 846. Hand of Straights

231 篇文章 0 订阅
120 篇文章 1 订阅

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

------------------------------------------------------------------------

  1. If there is some subsequence named as A with length >= 3, try to arrange current number after A in higher priority.
  2. If there isn't such a subsequence, try to create a consecutive subsequence with length
  3. 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'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.

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))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值