• Leetcode1296划分数组为连续数字的集合


    解法1:

    最暴力的方法,存每个数字出现的次数,排序之后,扫一遍,对于每个数字,看它后面连续的k-1个是否都存在。
    耗时:404ms

    class Solution {
    public:
        bool isPossibleDivide(vector<int>& nums, int k) {
            map<int,int> mp;
            for(int v:nums){
                mp[v]++;
            }
            sort(nums.begin(),nums.end());
            bool ans=true;
            for(int v:nums){
                if(!mp[v]){
                    continue;
                }else{
                    for(int i=1;i<k;i++){
                        if(!mp[v+i]){
                            ans=false;
                            break;
                        }
                    }
                    if(!ans){
                        break;
                    }else{
                        for(int i=0;i<k;i++){
                            mp[v+i]--;
                        }
                    }
                }
            }
            return ans;
        }
    };
    

    解法2:

    debug了1个小时...果然不会写代码了。
    用k个指针来指向当前正确的(连续)k个数,然后每次尝试往后移1位,判断是否有不满足的。
    耗时:108ms

    class Solution {
    public:
        bool isPossibleDivide(vector<int>& nums, int k) {
            int len=nums.size();
            cout << len << endl;
            if(len%k){
                return false;
            }
            int vis[len+5]={0};
            sort(nums.begin(),nums.end());
            int tag[k+5]={-1};
            tag[0]=0;
            vis[tag[0]]=1;
            for(int i=1;i<k;i++){
                for(int j=tag[i-1]+1;j<len;j++){
                    if(nums[j]==nums[tag[i-1]]+1){
                        tag[i]=j;
                        break;
                    }
                }
                if(tag[i]==-1){
                    return false;
                }
                vis[tag[i]]=1;
            }
            while(true){
                tag[0]++;
                while(vis[tag[0]] && tag[0]+1<len){
                    tag[0]++;
                }
                if(vis[tag[0]]){
                    break;
                }
                vis[tag[0]]=1;
                for(int i=1;i<k;i++){
                    tag[i]=max(tag[i],tag[i-1])+1;
                    while(tag[i]+1<len && (nums[tag[i]]!=nums[tag[i-1]]+1 || vis[tag[i]])){
                        tag[i]++;
                    }
                    if(nums[tag[i]]!=nums[tag[i-1]]+1 || vis[tag[i]]){
                        return false;
                    }
                    vis[tag[i]]=1;
                }
            }
            for(int i=0;i<len;i++){
                if(!vis[i]){
                    return false;
                }
            }
            return true;
        }
    };
    
  • 相关阅读:
    Java技术 第六次实验 计科1501 胡开辉
    Java技术 第五次实验 计科1501 胡开辉
    Java第四次作业
    Java第三次作业
    Css新增内容
    Html5新增特性
    Jquery图集
    选项卡
    轮播图
    标准命名
  • 原文地址:https://www.cnblogs.com/zxcoder/p/12173416.html
Copyright © 2020-2023  润新知