Python实现划分数组为连续数字的集合

简介: Python实现划分数组为连续数字的集合

问题描述

给你一个整数数组 nums 和一个正整数 k,请你判断是否可以把这个数组划分成一些由 k 个连续数字组成的集合。

如果可以,请返回 True;否则,返回 False。

示例 1:

输入:nums = [1,2,3,3,4,4,5,6], k = 4

输出:true

解释:数组可以分成 [1,2,3,4] 和 [3,4,5,6]。

示例 2:

输入:nums = [3,2,1,2,3,4,3,4,5,9,10,11], k = 3

输出:true

解释:数组可以分成 [1,2,3] , [2,3,4] , [3,4,5] 和 [9,10,11]。

示例 3:

输入:nums = [3,3,2,2,1,1], k = 3

输出:true

示例 4:

输入:nums = [1,2,3,4], k = 3

输出:false

解释:数组不能分成几个大小为 3 的子数组。

解决方案

刚刚拿到这道题,笔者想的是先找出数组中最小的一个数,然后根据k的值从数组中删除相对应的元素,比如k等于3,数组中最小数字为1,那么就从列表中删除1,2,3三个元素,如果数组中没有对应的元素,那就该返回False。于是笔者写出了如下题解:

def isPossibleDivide(nums, k):

     nums = sorted(nums)

     for _ in range(len(nums)//k):

         minv = nums[0]

         for _ in range(k):

             if minv in nums:

                 nums.remove(a)

                 minv +=1

     return len(nums) == 0

 

 

但是在第二个for循环里面有过多操作,如果k的值太大,那么代码运行内存便会很大,在规定内存内运行便会超时。于是笔者想到了第二种方法,虽然代码量大一点,但是相对于第一种,时间复杂度更小,不容易超时,用集合找出数组中出现过的数字,再用字典统计每个数字出现的次数,设置判定条件,再根据连续判定条件返回对应布尔型。

python代码

def isPossibleDivide(nums, k):

     n = len(nums)

     if n % k != 0:

         return False

     # 用集合记录可能的数字

     s = set(nums)

     minList = list(s)

     minList.sort()

     # 用字典存储每个数字出现的次数

     d = dict()

     for num in nums:

         if num not in d:

             d[num] = 0

         d[num] += 1

     # 判断每组是否可由k个连续数字构成

     m = n // k  # m组

     start = 0  # 起始位置

     for mi in range(m):

         if start >= len(minList):

             return False

         minv = minList[start]

         flag = True

         t = start

         for key in range(minv, minv +  k):

             if key not in d:

                 return False

             if d[key] < 1:

                 return False

             elif d[key] == 1:

                 d[key] -= 1

                 t += 1

             elif d[key] > 1:

                 d[key] -= 1

                 if flag:

                     start = t

                     flag = False

         if flag:

             start = t

     return True

 


结语

在遇到这类编程题时,要运用多种方法尝试求解,考虑时间复杂度和空间复杂度等多方面因素寻找最优解法。

目录
相关文章
|
3月前
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
128 1
思科设备巡检命令Python脚本大集合
|
3月前
|
存储 缓存 API
解密 Python 集合的实现原理
解密 Python 集合的实现原理
68 11
|
3月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
138 10
|
3月前
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
174 4
|
3月前
|
存储 自然语言处理 数据处理
使用Python计算多个集合的交集详解
使用Python计算多个集合的交集详解
112 1
|
4月前
|
存储 API 索引
Python 的集合是怎么实现的?
Python 的集合是怎么实现的?
62 9
|
4月前
|
存储 索引 Python
Python常用数据结构——集合
Python常用数据结构——集合
82 3
|
5月前
|
存储 数据处理 索引
如何删除 Python 数组中的值?
【8月更文挑战第29天】
261 8
|
5月前
|
索引 Python
向 Python 数组添加值
【8月更文挑战第29天】
77 8
|
5月前
|
存储 缓存 C语言

热门文章

最新文章