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此,每次令數組向右移動一個爲之,最後那個元素創建一個變量保存,在移動結束後將其放在第一個位置。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int temp=0;
for(int i=0;i<k;i++){
temp=nums.back();
for(int j=nums.size()-2;j>=0;--j){
nums[j+1]=nums[j];
}
nums[0]=temp;
}
}
};
但是這種解法在leedcode中超出了時間限制。
解法2
把前n-k個數字翻轉一下,再把後k個數字翻轉一下,最後再把整個數組翻轉一下,就可以得到解。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
if(n==0)return;
k=k%nums.size();
reverse(nums.begin(),nums.begin()+n-k);
reverse(nums.begin()+n-k,nums.end());
reverse(nums.begin(),nums.end());
}
};
執行用時:48 ms