Python|Leetcode《846》《1296》|一手顺子 划分数组为连续数字的集合
Posted 二哥不像程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python|Leetcode《846》《1296》|一手顺子 划分数组为连续数字的集合相关的知识,希望对你有一定的参考价值。
专栏《LeetCode|一刷到底》
打卡每天leetcode精选每日一题(尽量不断更!)
点击关注不迷路!!!
一、题目描述
<846><1096>题目相同
- 题目:一手顺子| 划分数组为连续数字的集合
- 难度:中等
- 描述:Alice 手中有一把牌,她想要重新排列这些牌,分成若干组,使每一组的牌数都是 groupSize ,并且由 groupSize 张连续的牌组成。
给你一个整数数组 hand 其中 hand[i] 是写在第 i 张牌,和一个整数 groupSize 。如果她可能重新排列这些牌,返回 true ;否则,返回 false 。- 示例1
输入:hand = [1,2,3,6,2,3,4,7,8], groupSize = 3
输出:true
解释:Alice 手中的牌可以被重新排列为 [1,2,3],[2,3,4],[6,7,8]。
- 示例2
输入:hand = [1,2,3,4,5], groupSize = 4
输出:false
解释:Alice 手中的牌无法被重新排列成几个大小为 4 的组。
提示:
- 1 <= k <= hand.length <= 1 0 4 10^4 104
- 0 <= hand[i] <= 1 0 9 10^9 109
- 1 <= groupSize <= hand.length
二、题目解析
本题需要让我们找到指定数量的连续子数组,难点就在于如何考虑重复数字出现的情况。
由于每个数字只能使用一次,因此我们考虑使用哈希计数的方式进行统计,然后从计数字典中从小到大排除数据。过程如下:
- 构造计数字典(假设构造3个数组)
假设数组为:[1, 2, 3, 6, 2, 3, 4, 7, 8]
构造字典为:1: 1, 2: 2, 3: 2, 6: 1, 4: 1, 7: 1, 8: 1 - 从最小的开始遍历,每遍历到一个数字都判断其是否在字典中存在,若存在则查找其数值+1和+2的数字是否存在,存在则计数-1,不存在则返回False,存在则继续进行遍历,直到结束。
三、解题代码
解法(一)
class Solution:
def isNStraightHand(self, hand: List[int], groupSize: int) -> bool:
n = len(hand)
hand.sort()
if n % groupSize != 0:
return False
C = Counter(hand)
for i in hand:
# 如果不存在C[i]直接寻找下一个
if not C[i]:
continue
# 遍历GroupSize个数字是不是连续的
for j in range(i, i + groupSize):
print(j, C[j])
if not C[j]:
return False
C[j] -= 1
return True
解法(二)
while循环解法
class Solution:
def isNStraightHand(self, hand: List[int], groupSize: int) -> bool:
n = len(hand)
if n % groupSize != 0:
return False
C = Counter(hand)
for i in sorted(C.keys()):
# 如果不存在C[i]直接寻找下一个
while C[i]:
# 遍历GroupSize个数字是不是连续的
for j in range(i, i + groupSize):
print(j, C[j])
if not C[j]:
return False
C[j] -= 1
return True
以上是关于Python|Leetcode《846》《1296》|一手顺子 划分数组为连续数字的集合的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 846. Hand of Straights
leetcode-168周赛-1296-划分数字为连续数字的集合