• LeetCode 189. Rotate Array


    原题链接在这里:https://leetcode.com/problems/rotate-array/

    题目:

    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.

    题解:

    Reverse the whole array[0, n-1], then reverse [0, k-1] and [k, n-1].

    Time Complexity: O(n). Space: O(1).

    AC Java:

     1 public class Solution {
     2     public void rotate(int[] nums, int k) {
     3         if(nums == null || nums.length == 0){
     4             return;
     5         }
     6         int len = nums.length;
     7         k = k%len;
     8         reverse(nums, 0, len-1);
     9         reverse(nums, 0, k-1);
    10         reverse(nums, k, len-1);
    11     }
    12     
    13     private void reverse(int [] nums, int i, int j){
    14         while(i < j){
    15             swap(nums, i++, j--);
    16         }
    17     }
    18     private void swap(int [] nums, int i, int j){
    19         int temp = nums[i];
    20         nums[i] = nums[j];
    21         nums[j] = temp;
    22     }
    23 }

    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).

     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 ListReverse Words in a String II.

  • 相关阅读:
    Java
    Java
    Java
    Java
    NYOJ 127 星际之门(一)
    BNUOJ 1013 YC大牛的判题任务
    BNUOJ 1011 人工智能?
    HDU 1035 Robot Motion
    HDU 1214 圆桌会议
    NYOJ 86 找球号(一)
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/5148856.html
Copyright © 2020-2023  润新知