1. 程式人生 > >leetcode題解之189

leetcode題解之189

189.旋轉陣列

給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。

一開始思路:
當k大於陣列長度,對k取餘。

k = k % nums.length;

將陣列向後移動一位,將最後數字與之前每一項交換,依次迴圈k次
時間複雜度:O(n2)

進階版:
以k位置為分割點將左右兩部分分別反轉,再整體反轉。
程式碼:

class Solution {
    public void rotate(int[] nums, int k) {
        //方法一,將最後一個與前面每一項交換(笨方法)
        // while(k-- != 0){
// for(int i = nums.length - 1;i > 0; i--){ // swap(nums, i, i - 1); // } // } //方法二,以k將陣列分為兩部分,先分別反轉再將總陣列反轉 int x = k % nums.length;//取餘 x = nums.length - x; reverse(nums,0,x - 1); reverse(nums,x,nums.length - 1); reverse
(nums,0,nums.length - 1); } private void swap(int[] nums,int i ,int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } private void reverse(int[] nums,int begin,int end){ int i = begin; int j = end; while(i < j)
{ swap(nums,i,j); i++; j--; } } }