标签:
原题链接在这里:https://leetcode.com/problems/rotate-array/
Method 1 新建一个array res, 找出rotate 后array 和 原来array 的位置对应关系是 res[i] = nums[(i+len-k) % len]. 最后把res 赋值回 nums.
Time Complexity: O(n). Space: O(n).
Method 2 每次只rotate 一个位置,一共循环k次。可以不用额外空间,但也用了更多的时间。
Time Complexity: O(k*n). Space: O(1).
Method 3 先reverse全部array, 在以k为分界点,分别reverse 前半部分[0, k-1], 后半部分[k, len-1]. 三种方法都需要注意k = k%len.
Time Complexity: O(n). Space: O(1).
AC Java:
1 public class Solution { 2 public void rotate(int[] nums, int k) { 3 int len = nums.length; 4 k = k % len; 5 6 /* 7 //Method 1, takes O(n) space, running in O(n) time 8 9 int[] res = new int[len]; 10 11 for(int i = 0;i<len;i++){ 12 res[i] = nums[(i+len-k)%len]; 13 } 14 15 for(int i = 0;i<len;i++){ 16 nums[i] = res[i]; 17 } 18 */ 19 20 /* 21 //Method 2, takes O(k*n) time 22 23 while(k>0){ 24 int temp = nums[len - 1]; 25 for(int i = len-1;i>0;i--) 26 { 27 nums[i] = nums[i-1]; 28 } 29 nums[0] = temp; 30 31 k--; 32 } 33 */ 34 35 //Method 3, reverse the whole array, cut it into two parts, reverse each of them 36 reverse(nums, 0, len-1); 37 reverse(nums, 0, k-1); 38 reverse(nums, k, len-1); 39 } 40 41 private void reverse(int[] arr, int left, int right){ 42 while(left<right){ 43 int temp = arr[left]; 44 arr[left] = arr[right]; 45 arr[right] = temp; 46 left++; 47 right--; 48 } 49 } 50 }
与Rotate List相似
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/5148856.html