1296 划分数组为连续数字的集合(treemap)

1. 问题描述:

给你一个整数数组 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 的子数组。
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
1 <= k <= nums.length
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-array-in-sets-of-k-consecutive-numbers

2. 思路分析:

① 因为给出的数组可能是无序的,所以我们需要使用map来进行计数,因为求解的是连续的一组数字,所以需要按照从小到大的顺序进行排列,所以我们首先可以对数组遍历的时候使用treemap对数组中出现的数字进行计数,并且使用treemap得到的键是按照从小到大的顺序进行排列的,这样方便我们进行分组

② map中放置的键值对不容易操作,使用treemap进行计数之后那么我们需要将对应的数字映射到数组中,这样可以使用下标对分组的数字进行操作,对当前的的k个数字进行判断,看一下这一组的k个数字是否连续,也就是相邻两个数字的差值是否是1,加入不是1那么说明存在不是一组的数字,直接返回false

③ 对于一组的k个数字我们相应地移除掉当前分组的首个元素的值,最后检查数组元素的值是否是0,假如全部是0那么满足条件

3. 代码如下:

class Solution {
 /*可以使用map来进行计数, 先将结果放入数组中然后先检查这k个元素是否连续, 不连续直接返回false, 连续则依次取出k个元素*/
   public boolean isPossibleDivide(int[] nums, int k) {
        /*使用TreeMap进行键的自定义排序*/
        Map<Integer, Integer> map = new TreeMap<>();
        for (int i = 0; i < nums.length; ++i){
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
        }
        int [][]rec = new int[map.size()][2];
        int n = 0;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()){
            rec[n][0] = entry.getKey();
            rec[n][1] = entry.getValue();
            ++n;
        }
        int len = map.size();
        int count = 0;
        for (int i = 0; i <= len - k; ++i){
            if (rec[i][1] == 0)continue;
            /*检查k个元素是否连续*/
            for (int j = i + 1; j < i + k && j < map.size(); ++j){
                if (rec[j - 1][0] + 1 != rec[j][0]) return false;
            }
            /*将取出的k个元素减掉*/
            int t = rec[i][1];
            for (int j = i; j < i + k; ++j) {
                rec[j][1] -= t;
            }
        }
        for (int i = 0; i < len; ++i) if (rec[i][1] != 0) return false;
        return true;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值