Python|Leetcode《846》《1296》|一手顺子 划分数组为连续数字的集合

简介: Python|Leetcode《846》《1296》|一手顺子 划分数组为连续数字的集合

一、题目描述

<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 的组。


提示:

image.png

二、题目解析

本题需要让我们找到指定数量的连续子数组,难点就在于如何考虑重复数字出现的情况。

由于每个数字只能使用一次,因此我们考虑使用哈希计数的方式进行统计,然后从计数字典中从小到大排除数据。过程如下:


1.构造计数字典(假设构造3个数组)

假设数组为:[1, 2, 3, 6, 2, 3, 4, 7, 8]

构造字典为:{1: 1, 2: 2, 3: 2, 6: 1, 4: 1, 7: 1, 8: 1}


2.从最小的开始遍历,每遍历到一个数字都判断其是否在字典中存在,若存在则查找其数值+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


相关文章
|
24天前
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
62 1
思科设备巡检命令Python脚本大集合
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
1月前
|
存储 缓存 API
解密 Python 集合的实现原理
解密 Python 集合的实现原理
37 11
|
1月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
19 4
|
1月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
69 10
|
1月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
18 0
Leetcode第三十三题(搜索旋转排序数组)
|
1月前
|
存储 自然语言处理 数据处理
使用Python计算多个集合的交集详解
使用Python计算多个集合的交集详解
38 1
|
1月前
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
85 4
|
2月前
|
存储 API 索引
Python 的集合是怎么实现的?
Python 的集合是怎么实现的?
48 9
|
1月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
56 0