給定乙個陣列,將陣列中的元素向右移動 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)的原地演算法
在陣列元素個數 n 不為0的前提下,分3種情況1.如果 k 和 n 相同,則陣列不變
2.如果 k 小於 n ,則對陣列進行 k 次迴圈,把最後乙個元素移到第乙個元素,其他依次後移
3.如果 k 大於 n ,則對陣列進行 k-n 次迴圈,重複步驟2
耗時: 384ms
這個思路大概是最笨的方法,不得不承認,自己對於演算法還是弱雞。
class solution
nums[0] = temp;
}
}else
if (nums.size() < k)
for (int i = 0; i < nums.size(); i++)
}};
這個思路是使用了c++標準庫函式 reverse假設輸入陣列的下標是0 ~ n-1,需要旋轉的步數是k,那麼按照下面的方法就可以完成旋轉陣列
(其中reverse表示用雙指標交換的方法翻轉陣列):
step 1. reverse原來的陣列。
step 2. reverse 0~ k-1。
step 3. reverse k ~ n-1。
那麼得到的新陣列就是個旋轉陣列了。
舉個例子來說是這樣的:
元素組: 1 2 3 4 5 翻轉步長:k=3
step 1 reverse原來的陣列: 5 4 3 2 1
step 2 reverse 0~ k-1: 3 4 5 2 1
step 3 reverse k ~ n-1: 3 4 5 1 2
最後的【3 4 5 1 2】就是旋轉陣列的結果了,這種方法的時間複雜度是o(n),空間複雜度是o(1),是非常好的方法了
耗時: 12ms
class solution
};
leetcode 初級演算法 陣列
給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度2,並且原陣列 nums 的前兩個元素被修改為1,2...
Leetcode 初級演算法 陣列
給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o 1 額外空間的條件下完成。給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素被修改為 1...
LeetCode 初級演算法 陣列
給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。輸入 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 輸入 ...