1. 程式人生 > >leetcod刷題---旋轉陣列

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);//把迴圈開始那個元素的坑佔了,一輪迴圈就結束了
    }
}