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