N右回転の配列の実装方式

タイトル

右回転のkビット列

k=0  1 2 3 4 5
k=1  5 1 2 3 4
k=2  4 5 1 2 3
...

道路の問題が複数の実装を持つことができます解決するために、私はさらにいくつかの興味深い、約書くために選びました。

この方法の一つ

void Fun(vector<int> &nums,int k){
    while(--k>=0){
        nums.insert(nums.begin(),nums.back());
        nums.pop_back();
    }
}

コードがない以上より、簡単です。ダイナミックアレイの借用利点は、複雑性O(k)は、実際にはまだ比較的時間がかかる(ベクター挿入および欠失)であってもよいです。に応じてkの値(配列の長さとkの大きさとの関係を最適化する)ことができます。

void Fun(vector<int> &nums,int k){
    k = k % nums.size();
    
    //根据k与nums.size()/2的大小关系来进行分别处理
    if(k>nums.size()/2){
        while (++k<=nums.size()){
            nums.push_back(nums.front());
            nums.erase(nums.begin());
        }
    }else{
        while (--k>=0){
            nums.insert(nums.begin(),nums.back());
            nums.pop_back();
        }
    }
}

方法二

void Fun(vector<int> &nums,int k){
    k = k % nums.size();
    if(k>0) {
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin() + k);
        reverse(nums.begin() + k, nums.end());
    }
}

コードは、ダイナミックアレイ、簡単なのと同じ方法を使用して、言うが、オフセットしません。

メソッドスリー

右側にKビットは、原稿が+ kは、以下のアルゴリズムが考えに基づいて設計されているIの位置に移動し、i番目のビットの配列として理解することができます。

void Fun(vector<int> &nums,int k){
    for(int i=0,count = 0;count<(int)nums.size();++i){
        int j=i;
        int temp = nums[i];

        do{
            j+=k;
            j=j%(int)nums.size();
            swap(nums[j],temp);
            ++count;
        }while(j!=i);
    }
}

O(N)の時間計算量は、空間的複雑度はO(1)です。このアルゴリズムは、通常の配列またはダイナミックアレイ、高効率化に適しています。

公開された63元の記事 ウォン称賛73 ビュー70000 +

おすすめ

転載: blog.csdn.net/jjwwwww/article/details/100560612