leetcod刷題---旋轉陣列
吐槽
今天無聊刷這道題發現,,,不審題很尷尬唉,不然老過不了
題目
給定一個數組,將陣列中的元素向右移動 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) 的原地演算法。
思路
這道題我一上手就想到用取餘什麼的,重新建個數組,然後取餘賦值,返回這個新建的陣列
然後,就發現這個網站上面自己的程式碼放在上面測試時候,老是有問題,然後我還提交以為是網站問題
下面就是程式碼233,很簡單
public int[] rotate(int[] nums, int k) {
int[] result = new int[nums.length];
for (int i = 0;i < nums.length;i++){
result[ (i+k) % nums.length] = nums[i];
}
return result;
}
之所以錯誤的原因很簡單,因題目的要求是要求使用空間複雜度為 O(1) 的原地演算法。
//估計測試網站看到你申請空間時候,測試這塊就有問題了,很尷尬唉
所以,我們換種思路,把這個取餘的想法進化一下,讓其不用其他輔助陣列就好了
我們每次在原陣列處理的時候,將一個數組元素放到另外一個數組元素的位置,我們要放的元素處理了,但是原來位置的元素怎麼辦,我們也需要將這塊處理下唉
比如:將下標為i的元素放在下標i+k處,再將下標i+k處的元素放置在正確位置
舉個例子
現在這個陣列就是 1 2 3 4 5 6 k =2
第一次時候 1 向右2個位置 跑到3的位置上
3 只好也右2個位置 把5的位置佔了
5 向右也動兩個位置 又因為迴圈取餘出來 現在把1之前的位置佔了
然後這一輪結束了,因為1元素的移動,3元素和5元素也要放到相應的位置上
然後進行下一輪
程式碼
public void rotate1(int nums[],int k){
if (k % nums.length == 0 || nums.length == 1){
return;
}
int count = 0;
k = k % nums.length;
for(int start = 0;count < nums.length;start++){
int current = start;
int p = nums[start];
do {
int next = (current + k)%nums.length;//取餘操作別忘了
int temp = nums[next];
nums[next] = p;//把移動的坑位佔了
p = temp;
count++;
current = next;//看下坑位元素也要找他的新坑位
}while (current != start);//把迴圈開始那個元素的坑佔了,一輪迴圈就結束了
}
}