leetcode題解之189
阿新 • • 發佈:2018-11-06
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--;
}
}
}