Leetcode1296アレイは、連続した数字のセットに分割されています

解決策1:

最も暴力的な方法で、回ずつ保存された番号が表示されますの数は、ソート後、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:

本当に書き込みコードすることはできません...一時間をデバッグします。
正しい現在のポインタとKは、次いで(連続)数k、および、各時間が満たされていないかどうかを決定する試みを戻します。
消費: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;
    }
};

おすすめ

転載: www.cnblogs.com/zxcoder/p/12173416.html