【初級算法】3.旋轉數組


題目如下:

給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: [1,2,3,4,5,6,7] 和 k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右旋轉 1 步: [7,1,2,3,4,5,6]
向右旋轉 2 步: [6,7,1,2,3,4,5]
向右旋轉 3 步: [5,6,7,1,2,3,4]
示例 2:

輸入: [-1,-100,3,99] 和 k = 2
輸出: [3,99,-1,-100]
解釋: 
向右旋轉 1 步: [99,-1,-100,3]
向右旋轉 2 步: [3,99,-1,-100]
說明:

盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。
要求使用空間復雜度為 O(1) 的原地算法。

解題思路:

本題較為簡單解題,解題思路如下:

1.每次向右旋轉,一個數據,旋轉K次即可。算法的時間復雜度為O(n)。代碼如下:

python:

 void leftShift(vector<int>& nums){
        int tmp = nums[nums.size()-1];
        for(int i = nums.size()-1;i >=1;--i){
            nums[i] = nums[i-1];
        }
        nums[0] = tmp;
    }
    
    void rightShift(vector<int>& nums){
         int tmp = nums[0];
        for(int i = 0;i < nums.size()-1;++i){
            nums[i] = nums[i+1];
        }
        nums[nums.size()-1] = tmp;
    }
    
    void rotate(vector<int>& nums, int k) {
        k = k%nums.size();
        
        for(int i = 0; i < k; ++i){
            leftShift(nums);
        }
        
        return;
    }

2.數組全部反轉,然后再依次反轉前k個數據和最后n-k個數據:

代碼如下:

C++:

void rotate(vector<int>& nums, int k) {
        k = k%nums.size();
        std::reverse(nums.begin(),nums.end());
        std::reverse(nums.begin(),nums.begin()+k);
        std::reverse(nums.begin()+k,nums.end());
        
        return;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM