刷題-力扣-189
阿新 • • 發佈:2021-01-08
189. 旋轉陣列
題目連結
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/rotate-array/
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題目描述
給定一個數組,將陣列中的元素向右移動 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) 的 原地 演算法。
* 通過次數210,743提交次數468,201
題目分析
- 根據題目描述和例項,首先想到迴圈法。
- 每次移動一個元素,總共移動k次。時間複雜度為O(kn),空間複雜度為O(1)。超時。
- 反轉法。先反轉整個列表,再反轉前k個元素,反轉後n - k個元素,即可。
程式碼
迴圈法,時間複雜度O(kn)(超時)
class Solution { public: void rotate(vector<int>& nums, int k) { int n = nums.size(); k = k % n; for (int i = 0; i < k; i++) { int e = nums[n - 1]; for (int j = n -1; j > 0; j --) { nums[j] = nums[j - 1]; } nums[0] = e; } } };
反轉法,時間複雜度O(n)
class Solution { public: void reverse(vector<int>& nums, int s, int e) { while (s < e) { int temp = nums[s]; nums[s++] = nums[e]; nums[e--] = temp; } } void rotate(vector<int>& nums, int k) { int n = nums.size(); k = k % n; reverse(nums, 0, n - 1); reverse(nums, 0, k - 1); reverse(nums, k, n - 1); } };
用時36min