Leetcode 初級演算法 陣列迴圈右移

2021-08-28 04:32:29 字數 1578 閱讀 3218

給定乙個陣列,將陣列中的元素向右移動 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 輸入 ...