演算法 旋轉陣列

2021-09-11 03:12:31 字數 1837 閱讀 6613

給定乙個陣列,將陣列中的元素向右移動 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) 的原地演算法。

我的解答:

class solution 

int temp ,temp2;

int length = nums.length;

if (k > length)

k = k%length;

if (length == k || k==0)

int count =0;

out:for (int i = length - 1; i >= length - 1 - k; i--)

if (j == i) }}

}}

/**

* 大概思路是,從陣列的末尾開始,把現在的資料放到每隔k的位置上,

* 超過了陣列長度,就取餘。

* 如果執行了一圈,回到了開始替換的位置,那麼執行下一圈。

*比如:

原始陣列:[1,2,3,4]

第一次把4放到陣列第二的位置,並把2快取起來

陣列:[1,4,3,4]

第二次把陣列第四的位置,快取起來,並把快取的2放到陣列第四的位置,

陣列:[1,4,3,2]

這時候發現又回到了原來的位置,那麼本次迴圈結束,從第三個位置開始,繼續迴圈

陣列:[3,4,3,2]

陣列:[3,4,1,2]

陣列:[3,4,1,2]

* 如果執行過程中從來沒回到過原來的位置,那麼替換n 次以後,就是

* 最終的陣列,所有的資料都換了一下位置。

*比如:

* 原始陣列:[1,2,3,4,5]

* 第一次,把第五的位置陣列,放到第二個,因為k是2,並且第二個位置的2 要快取起來

* 陣列:[1,5,3,4,5]

* 第二次,把第四個位置的4快取起來,然後把快取的2放到第四個位置

陣列:[1,5,3,2,5]

第三次,把第乙個位置的1快取起來,然後把快取的4放到第乙個位置

陣列:[4,5,3,2,5]

這種是永遠都不會回到之前替換過的位置,替換n次結束即可

陣列:[4,5,1,2,5]

陣列:[4,5,1,2,3]

陣列:[4,5,1,2,3]

* * 時間複雜度是n*k,網上最快的算是0m,說實話,我有點不服氣

* 因為他們用了新的陣列,開闢了新的記憶體空間。

* 我錯了,時間複雜度是o(n) ,不是o(n*k)

* 因為當執行了n次之後,雙層迴圈就會結束。

* * @param nums

* @param k

*/

網上最快的演算法:

但是這種演算法,額外開闢了空間。我覺得有違題的意思。

class solution 

}

演算法 旋轉陣列

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

演算法題 旋轉陣列

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排序的陣列的乙個旋轉 遞增或遞減的 輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排序的陣列的乙個旋轉 遞增或遞減的 輸出旋轉...

演算法小練 旋轉陣列

title 演算法小練 旋轉陣列 date 2019 11 21 18 53 13 categories 給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1,2,3,4,5,6,7 和 k 3 輸出 5,6,7,1,2,3,4 解釋 向右旋轉 1 步 7,1,2...