O1空間複雜度實現陣列迴圈右移_LeetCode189
問題描述
給定一個陣列,將陣列中的元素向右移動 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]來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/rotate-array
環狀陣列法
通過取模運算可以確定 n u m s [ i ] nums[i] nums[i]應該移動到的下標為 ( i + k ) % n u m s . s i z e ( ) (i+k)\%nums.size() (i+k)%nums.size(),依次執行右移操作。過程中如果出現環(即回到最初開始移動的下標 i i i),則從 i + 1 i+1 i+1開始繼續右移。整個過程通過計數器 c o u n t count count記錄已經右移的個數, c o u n t = n u m s . s i z e ( ) count=nums.size() count=nums.size()時右移結束。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(nums.size()==0) return;
k = k % nums.size();
//nex當前要右移的數,i nex要右移至的下標
//start當前環形陣列的起始下標
//count計數器,已經右移的個數
int nex = nums[0],start = 0, count = 0, i = (0+k)%nums.size();
while(count < nums.size()){
int tmp = nums[i]; //暫存原來的nums[i]
nums[i] = nex; //右移賦值
nex = tmp; //更新下一輪右移的nex
count++; //右移數+1
if(i==start){ //出現環
i = (i+1)%nums.size(); //處理下一個數
nex = nums[i]; //更新新的nex
start = i; //更新新的start
}
i = (i+k)%nums.size();//更新下一次要右移至的下標
}
}
};
時間複雜度 O ( n ) O(n) O(n),空間複雜度 O ( 1 ) O(1) O(1)。
反轉元素法
首先將原陣列反轉,然後將前 k k k個元素反轉,最後將後 n − k n-k n−k個元素反轉。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(nums.size()==0) return;
k = k % nums.size();
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k, nums.end());
}
};
時間複雜度 O ( n ) O(n) O(n),空間複雜度 O ( 1 ) O(1) O(1)。
參考
[1] https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
相關文章
- 陣列元素迴圈右移問題陣列
- 習題8-3 陣列迴圈右移 及 練習7-8 方陣迴圈右移陣列
- 時間複雜度跟空間複雜度時間複雜度
- 時間複雜度和空間複雜度時間複雜度
- 時間複雜度與空間複雜度時間複雜度
- 如何不用演算法對陣列進行(0時間複雜度,0空間複雜度)排序?演算法陣列時間複雜度排序
- 時間複雜度O(n)和空間複雜度時間複雜度
- 時間複雜度和空間複雜度 順序時間複雜度
- PAT1008 陣列元素迴圈右移問題(java實現)陣列Java
- 如何降低空間複雜度 陣列本地操作複雜度陣列
- 關於計算時間複雜度和空間複雜度時間複雜度
- 【資料結構】-時間複雜度和空間複雜度資料結構時間複雜度
- 靜態佇列,迴圈陣列實現佇列陣列
- 時間與空間複雜度分析複雜度
- [PAT B] 1008 陣列元素迴圈右移問題陣列
- 1008 陣列元素迴圈右移問題 (20分)陣列
- PHP陣列函式的時間複雜度清單PHP陣列函式時間複雜度
- 冰與火之歌:「時間」與「空間」複雜度複雜度
- 1008 陣列元素迴圈右移問題 (20 分)java陣列Java
- 演算法的空間複雜度演算法複雜度
- PHP 演算法基礎----時間複雜度和空間複雜度(轉載)PHP演算法時間複雜度
- 那些年忽略的知識:時間複雜度和空間複雜度詳解時間複雜度
- 陣列迴圈陣列
- Leetcode 234. 迴文連結串列 快慢指標+連結串列逆序實現O(n)時間複雜度且O(1)空間複雜度LeetCode指標時間複雜度
- 122 演算法的時間複雜度和空間複雜度詳解演算法時間複雜度
- C 語言實現使用靜態陣列實現迴圈佇列陣列佇列
- C 語言實現使用動態陣列實現迴圈佇列陣列佇列
- 什麼才是真正的空間複雜度?複雜度
- 易被忽略的知識點之 ---- 各種時間複雜度和空間複雜度時間複雜度
- 陣列迴圈移位陣列
- 遞迴演算法的時間複雜度遞迴演算法時間複雜度
- 說說你對演算法中時間複雜度,空間複雜度的理解?如何計算?演算法時間複雜度
- 到底什麼才是真正的空間複雜度?複雜度
- 淺析程式碼圈複雜度及認知複雜度複雜度
- 自學 資料結構四月二十一日_時間複雜度&空間複雜度資料結構時間複雜度
- 陣列迴圈輸出陣列
- awk 陣列和迴圈陣列
- 合併兩個有序陣列,其中有一個陣列長度足夠長,在O(1)的空間複雜度裡進行合併陣列複雜度