[LeetCode] Rotate Array,leetcoderotate

來源:互聯網
上載者:User

[LeetCode] Rotate Array,leetcoderotate

Rotate an array of n elements to the right by k steps.

For example, with n=7 and k=3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.

解題思路1

首先把數組複製一遍,然後找到元素之間的映射關係: newnum[i] = oldnum[(i - k + n) % n],時間複雜度為O(n),空間複雜度為O(n)

實現代碼1
/*****************************************************************    *  @Author   : 楚興    *  @Date     : 2015/2/24 16:58    *  @Status   : Accepted    *  @Runtime  : 33 ms******************************************************************/class Solution {public:    void rotate(int nums[], int n, int k) {        int *temp = new int[n];        memcpy(temp, nums, n * sizeof(int));        k = k % n;        for (int i = 0; i < n; i++)        {            nums[i] = temp[(i - k + n) % n];        }        delete [] temp;    }};
解題思路2

將數組看成是一個環,每個元素每次往前走一步,迴圈k次。時間複雜度為O(k*n),耗時較長,空間複雜度為O(1)

實現代碼2
/*****************************************************************    *  @Author   : 楚興    *  @Date     : 2015/2/24 17:10    *  @Status   : Accepted    *  @Runtime  : 872 ms******************************************************************/class Solution {public:    void rotate(int nums[], int n, int k) {        k = k % n;        while (k--)        {            int temp = nums[n - 1];            for (int i = n - 1; i > 0; i--)            {                nums[i] = nums[i - 1];            }            nums[0] = temp;        }    }};
解題思路3

①將整個數組反轉
②將由分割點分割的兩個數組分別反轉
即:1 2 3 4 5 6 7 -> 7 6 5 | 4 3 2 1 -> 5 6 7 | 1 2 3 4
時間複雜度為O(n),空間複雜度為O(1)

實現代碼3
/*****************************************************************    *  @Author   : 楚興    *  @Date     : 2015/2/24 17:39    *  @Status   : Accepted    *  @Runtime  : 25 ms******************************************************************/class Solution {public:    void rotate(int nums[], int n, int k) {        k = k % n;        rev(nums, 0, n - 1);        rev(nums, 0, k - 1);        rev(nums, k, n - 1);    }    void rev(int num[], int left, int right)    {        int temp;        while (left < right)        {            temp = num[left];            num[left++] = num[right];            num[right--] = temp;        }    }};

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.