最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在C++中實(shí)現(xiàn)高效的數(shù)組原地輪轉(zhuǎn)的方法總結(jié)

 更新時(shí)間:2025年04月11日 11:27:17   作者:Lion 萊恩呀  
在 C++ 中,可以通過多種方式實(shí)現(xiàn)數(shù)組的輪轉(zhuǎn)操作,以下是幾種常見的實(shí)現(xiàn)方法及其對(duì)應(yīng)的代碼示例,文中通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下

一、問題: 數(shù)組輪轉(zhuǎn)

給定一個(gè)長(zhǎng)度為 n 的整數(shù)數(shù)組 nums,請(qǐng)將數(shù)組中的元素向右輪轉(zhuǎn) k 個(gè)位置,其中 k 是非負(fù)數(shù)。

示例:

輸入:nums = [1, 2, 3, 4, 5, 6, 7], k = 3
輸出:[5, 6, 7, 1, 2, 3, 4]

解釋:
向右輪轉(zhuǎn) 1 步:[7, 1, 2, 3, 4, 5, 6]
向右輪轉(zhuǎn) 2 步:[6, 7, 1, 2, 3, 4, 5]
向右輪轉(zhuǎn) 3 步:[5, 6, 7, 1, 2, 3, 4]

要求:

  • 實(shí)現(xiàn)數(shù)組的右輪轉(zhuǎn)功能。
  • 盡可能探索多種解決方案。 至少思考三種不同的算法思路
  • 挑戰(zhàn): 能否設(shè)計(jì)一個(gè) 空間復(fù)雜度為 O(1) 的原地算法 來解決此問題? 嘗試優(yōu)化解決方案,使其具有盡可能高的效率。
  • 分析提出的每種解決方案的時(shí)間復(fù)雜度和空間復(fù)雜度。

提示:

  • 考慮 k 大于數(shù)組長(zhǎng)度 n 的情況。
  • 仔細(xì)思考數(shù)組輪轉(zhuǎn)的本質(zhì),嘗試從不同的角度分解問題。

二、問題分析

數(shù)組輪轉(zhuǎn)的本質(zhì)是將數(shù)組中的元素整體向右移動(dòng) k 個(gè)位置,超出數(shù)組邊界的元素會(huì)“循環(huán)”回到數(shù)組的開頭。

關(guān)鍵點(diǎn):

  • k 的有效性: 當(dāng) k 大于等于數(shù)組長(zhǎng)度 n 時(shí),實(shí)際輪轉(zhuǎn)的步數(shù)是 k % n。 例如,如果 n = 7,k = 9,那么實(shí)際輪轉(zhuǎn) 2 步。 因此,需要對(duì) k 進(jìn)行取模運(yùn)算。
  • 實(shí)現(xiàn)空間復(fù)雜度為 O(1) 的原地算法是難點(diǎn)。 這意味著不能使用額外的數(shù)組來存儲(chǔ)臨時(shí)結(jié)果。
  • 效率: 如何盡可能減少元素移動(dòng)的次數(shù),提高算法效率。

思路 1: 暴力法(重復(fù)移動(dòng))。

  • 將數(shù)組的最后一個(gè)元素移動(dòng)到第一個(gè)位置,其他元素依次向右移動(dòng)。
  • 重復(fù)這個(gè)過程 k 次。
  • 優(yōu)點(diǎn): 實(shí)現(xiàn)簡(jiǎn)單,容易理解。
  • 缺點(diǎn): 時(shí)間復(fù)雜度高,效率低,為 O(n * k)。 當(dāng) k 接近 n 時(shí),效率非常差。

思路 2: 使用額外數(shù)組。

  • 創(chuàng)建一個(gè)新的數(shù)組 new_nums,長(zhǎng)度與原數(shù)組相同。
  • 將原數(shù)組 nums 中的每個(gè)元素 nums[i] 放到新數(shù)組的 new_nums[(i + k) % n] 位置上。
  • 將新數(shù)組 new_nums 復(fù)制回原數(shù)組 nums。
  • 優(yōu)點(diǎn): 時(shí)間復(fù)雜度較低,為 O(n)。
  • 缺點(diǎn): 需要額外的 O(n) 空間,不滿足原地算法的要求。

思路 3: 反轉(zhuǎn)數(shù)組。

  • 將整個(gè)數(shù)組反轉(zhuǎn)。
  • 將數(shù)組的前 k % n 個(gè)元素反轉(zhuǎn)。
  • 將數(shù)組的后 n - (k % n) 個(gè)元素反轉(zhuǎn)。
  • 原理:
    • 例如 nums = [1, 2, 3, 4, 5, 6, 7], k = 3
    • 反轉(zhuǎn)整個(gè)數(shù)組:[7, 6, 5, 4, 3, 2, 1]
    • 反轉(zhuǎn)前 k 個(gè)元素:[5, 6, 7, 4, 3, 2, 1]
    • 反轉(zhuǎn)后 n-k 個(gè)元素:[5, 6, 7, 1, 2, 3, 4]
  • 優(yōu)點(diǎn): 時(shí)間復(fù)雜度為 O(n),空間復(fù)雜度為 O(1),滿足原地算法的要求。
  • 缺點(diǎn): 需要對(duì)數(shù)組進(jìn)行三次反轉(zhuǎn)操作,理解起來稍微復(fù)雜一些。

思路 4: 循環(huán)替換。

  • 從位置 0 開始,將該位置的元素移動(dòng)到 (0 + k) % n 位置,再將該位置的元素移動(dòng)到 (0 + 2k) % n 位置,以此類推。
  • 為了避免重復(fù)循環(huán),需要記錄已經(jīng)訪問過的位置,或者使用一個(gè)計(jì)數(shù)器來控制循環(huán)的次數(shù)。
  • 優(yōu)點(diǎn): 空間復(fù)雜度為 O(1)。
  • 缺點(diǎn): 實(shí)現(xiàn)相對(duì)復(fù)雜,需要仔細(xì)處理循環(huán)的邊界條件。時(shí)間復(fù)雜度O(n)。

思路 5: 使用GCD(最大公約數(shù))來優(yōu)化循環(huán)替換。

  • 如果 n 和 k 的最大公約數(shù)是 1,那么只需要一個(gè)循環(huán)就能完成所有的替換。 但如果最大公約數(shù)不是1,則需要多個(gè)循環(huán)。

  • 找到 n 和 k 的最大公約數(shù) gcd。 循環(huán)從 0 到 gcd - 1。 在每個(gè)循環(huán)中,執(zhí)行循環(huán)替換。

  • 優(yōu)點(diǎn): 優(yōu)化了循環(huán)替換算法

  • 缺點(diǎn): 需要計(jì)算最大公約數(shù),復(fù)雜度增加。

復(fù)雜度分析:

解決方案時(shí)間復(fù)雜度空間復(fù)雜度原地算法?
暴力法O(n * k)O(1)
額外數(shù)組O(n)O(n)
反轉(zhuǎn)數(shù)組O(n)O(1)
循環(huán)替換O(n)O(1)
GCD循環(huán)替換O(n)O(1)

三、算法實(shí)現(xiàn)

3.1、使用額外數(shù)組(效果較差)

  • 創(chuàng)建一個(gè)新的數(shù)組 new_nums,長(zhǎng)度與原數(shù)組相同。
  • 將原數(shù)組 nums 中的后 k % num.size()個(gè)元素 nums[i] 放到新數(shù)組的開頭位置上,其他元素依次放在末尾。
  • 將新數(shù)組 new_nums 復(fù)制回原數(shù)組 nums。
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        unsigned n = k % nums.size();
        if (n == 0)
            return;
        vector<int> ret(nums.end() - n, nums.end());
        
        for (unsigned i = 0; i < (nums.size() - n); ++i)
            ret.emplace_back(nums[i]);
        
        std::swap(ret, nums);
    }
};

時(shí)間復(fù)雜度:

  • 時(shí)間復(fù)雜度較低,為 O(n)。
  • 需要額外的 O(n) 空間。

3.2、反轉(zhuǎn)數(shù)組3次(實(shí)現(xiàn)簡(jiǎn)單)

這種方法實(shí)現(xiàn)相對(duì)容易,而且容易理解。

  • 將整個(gè)數(shù)組反轉(zhuǎn)。
  • 將數(shù)組的前 k % n 個(gè)元素反轉(zhuǎn)。
  • 將數(shù)組的后 n - (k % n) 個(gè)元素反轉(zhuǎn)。

原理:

  • 例如 nums = [1, 2, 3, 4, 5, 6, 7], k = 3
  • 反轉(zhuǎn)整個(gè)數(shù)組:[7, 6, 5, 4, 3, 2, 1]
  • 反轉(zhuǎn)前 k 個(gè)元素:[5, 6, 7, 4, 3, 2, 1]
  • 反轉(zhuǎn)后 n-k 個(gè)元素:[5, 6, 7, 1, 2, 3, 4]

代碼實(shí)現(xiàn):

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        unsigned n = k % nums.size();
        if (n == 0)
            return;
        unsigned size = nums.size();
        for (unsigned i = 0; i < size / 2; ++i) 
            std::swap(nums[i], nums[size - i - 1]);
        for (unsigned i = 0; i < n / 2; ++i) 
            std::swap(nums[i], nums[n - i -1]);
        for (unsigned i = 0; i < (size - n) / 2; ++i) 
            std::swap(nums[i + n], nums[size - i - 1]);
    }
};

3.3、循環(huán)替換(較為復(fù)雜)

從位置 0 開始,將該位置的元素移動(dòng)到 (0 + k) % n 位置,再將該位置的元素移動(dòng)到 (0 + 2k) % n 位置,以此類推。

為了避免重復(fù)循環(huán),需要記錄已經(jīng)訪問過的位置,或者使用一個(gè)計(jì)數(shù)器來控制循環(huán)的次數(shù)。

可以使用GCD(最大公約數(shù))來優(yōu)化循環(huán)替換:

  • 如果 n 和 k 的最大公約數(shù)是 1,那么只需要一個(gè)循環(huán)就能完成所有的替換。 但如果最大公約數(shù)不是1,則需要多個(gè)循環(huán)。

  • 找到 n 和 k 的最大公約數(shù) gcd。 循環(huán)從 0 到 gcd - 1。 在每個(gè)循環(huán)中,執(zhí)行循環(huán)替換。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        unsigned n = nums.size();
        int gcd = std::gcd(n, k % n);
        for (int i = 0; i < gcd; ++i) {
            int cur = i;
            int pre = nums[cur];
            do {
                int next = (cur + k) % n;
                std::swap(nums[next], pre);
                cur = next;
            } while (cur != i);
        }
    }
};

四、總結(jié)

C++中數(shù)組輪轉(zhuǎn)問題的五種解決方案:暴力法、額外數(shù)組、反轉(zhuǎn)數(shù)組、循環(huán)替換以及GCD優(yōu)化循環(huán)替換。分析了每種算法的時(shí)間和空間復(fù)雜度,并特別關(guān)注了原地算法的實(shí)現(xiàn)。通過對(duì)比不同方案,展示了如何在時(shí)間和空間之間權(quán)衡,最終實(shí)現(xiàn)高效且節(jié)省空間的數(shù)組輪轉(zhuǎn)。

其中,反轉(zhuǎn)數(shù)組和GCD優(yōu)化循環(huán)替換是在實(shí)際項(xiàng)目中推薦使用的。

以上就是在C++中實(shí)現(xiàn)高效的數(shù)組原地輪轉(zhuǎn)的方法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C++數(shù)組原地輪轉(zhuǎn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用c++和easyx圖形庫(kù)做一個(gè)低配版掃雷游戲

    利用c++和easyx圖形庫(kù)做一個(gè)低配版掃雷游戲

    這篇文章主要介紹了用c++和easyx圖形庫(kù)做一個(gè)低配版掃雷游戲,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • C語(yǔ)言用函數(shù)實(shí)現(xiàn)反彈球消磚塊

    C語(yǔ)言用函數(shù)實(shí)現(xiàn)反彈球消磚塊

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言用函數(shù)實(shí)現(xiàn)反彈球消磚塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語(yǔ)言字符函數(shù)和字符串函數(shù)示例詳解

    C語(yǔ)言字符函數(shù)和字符串函數(shù)示例詳解

    本文詳細(xì)介紹了C語(yǔ)言中字符分類函數(shù)、字符轉(zhuǎn)換函數(shù)及字符串操作函數(shù)的使用方法,并通過示例代碼展示了如何實(shí)現(xiàn)這些功能,通過這些內(nèi)容,讀者可以深入理解并掌握C語(yǔ)言中的字符串處理技巧,感興趣的朋友一起看看吧
    2025-03-03
  • c++實(shí)現(xiàn)發(fā)送http請(qǐng)求通過get方式獲取網(wǎng)頁(yè)源代碼

    c++實(shí)現(xiàn)發(fā)送http請(qǐng)求通過get方式獲取網(wǎng)頁(yè)源代碼

    這篇文章主要介紹了c++實(shí)現(xiàn)發(fā)送http請(qǐng)求,通過get方式獲取網(wǎng)頁(yè)源代碼的示例,需要的朋友可以參考下
    2014-02-02
  • Qt實(shí)現(xiàn)TCP同步與異步讀寫消息的示例代碼

    Qt實(shí)現(xiàn)TCP同步與異步讀寫消息的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何在?Qt?中實(shí)現(xiàn)?TCP?客戶端和服務(wù)器的同步和異步讀寫消息,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • C語(yǔ)言?const修飾普通變量和指針的操作代碼

    C語(yǔ)言?const修飾普通變量和指針的操作代碼

    這篇文章主要介紹了C語(yǔ)言const修飾普通變量和指針,用const修飾普通變量時(shí),是在語(yǔ)法層面限制了變量的修改,但是本質(zhì)上,變量還是變量,是一種不能被修改的變量,本文通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Qt自定義控件實(shí)現(xiàn)儀表盤

    Qt自定義控件實(shí)現(xiàn)儀表盤

    這篇文章主要為大家詳細(xì)介紹了Qt如何自定義控件實(shí)現(xiàn)儀表盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++ BloomFilter布隆過濾器應(yīng)用及概念詳解

    C++ BloomFilter布隆過濾器應(yīng)用及概念詳解

    布隆過濾器是由布?。˙urton Howard Bloom)在1970年提出的 一種緊湊型的、比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu),特點(diǎn)是高效地插入和查詢,可以用來告訴你 “某樣?xùn)|西一定不存在或者可能存在”,它是用多個(gè)哈希函數(shù),將一個(gè)數(shù)據(jù)映射到位圖結(jié)構(gòu)中
    2023-03-03
  • C語(yǔ)言基于EasyX繪制時(shí)鐘

    C語(yǔ)言基于EasyX繪制時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言基于EasyX繪制時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語(yǔ)言?超詳細(xì)順序表的模擬實(shí)現(xiàn)實(shí)例建議收藏

    C語(yǔ)言?超詳細(xì)順序表的模擬實(shí)現(xiàn)實(shí)例建議收藏

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要?jiǎng)?chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個(gè)數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示
    2022-03-03

最新評(píng)論

永和县| 皮山县| 鹿邑县| 油尖旺区| 突泉县| 黔西县| 灵川县| 株洲市| 绥德县| 衡阳市| 潮安县| 南投市| 宜黄县| 绥江县| 邯郸县| 南通市| 韶关市| 余江县| 德阳市| 永仁县| 汨罗市| 清丰县| 如皋市| 金平| 万年县| 微山县| 鹰潭市| 伽师县| 阿鲁科尔沁旗| 孟州市| 扎赉特旗| 东兰县| 彭州市| 漳浦县| 师宗县| 东阳市| 吉木萨尔县| 漳平市| 南皮县| 榕江县| 洛浦县|