首页 > 编程语言 > 详细

C++.划分数组为连续数字的集合

时间:2019-12-23 15:40:56      阅读:110      评论:0      收藏:0      [点我收藏+]

这是LeetCode周赛中的一道题,题目描述为:

输入为:一个整数数组 nums 和一个正整数 k

返回值:如果可以把这个数组划分成一些由 k 个连续数字组成的集合,返回True;否则,返回False

举例:nums = [1,2,3,3,4,4,5,6], k=4   可以被分为[1,2,3,4];  [3,4,5,6],所以返回True

   nums = [1,2,3,4] ;k=3, 不能被划分,所以返回False

 

一开始我用很容易想到的方式解决,但是测试用例中,有一个容量很大的数组,其中前n个数是1,剩下n+3个数是2,这样就会超出时间限制。因此最后使用C++里的map解决了这个问题。

    bool isPossibleDivide(vector<int>& nums, int k) {
        int vec_len = nums.size();
  //如果数组个数不能被k整除。结果数组肯定不会被均分的。
        if(vec_len%k!=0)
            return false;
        vector<int> sorted_nums = nums;
        sort(sorted_nums.begin(), sorted_nums.end());  //排序
  
  //使用map,其中key为nums里的数字,value为该数字存在的次数
        map<int, int> mp;
        for(int i=0;i<vec_len;i++) 
            mp[sorted_nums[i]] ++;

        for(int i=0;i<vec_len;i++)
        {
   //如果某个数字出现的次数不为0,那么比这个数字大0~k以内的数字也必须存在
            if(mp[sorted_nums[i]]!=0)
            {
                for(int j=0;j<k;j++)
                {
                    if(mp[sorted_nums[i]+j]==0)  //比这个数字大0~k的数字也必须存在
                        return false;  //否则返回false
                    mp[sorted_nums[i]+j]--;   //这个数字被使用一次,因此次数减1
                }
            }
        }
        return true;
    }

C++.划分数组为连续数字的集合

原文:https://www.cnblogs.com/why1012/p/12083845.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!