zoukankan      html  css  js  c++  java
  • 189. Rotate Array

    Given an array, rotate the array to the right by k steps, where k is non-negative.

    Example 1:

    Input: [1,2,3,4,5,6,7] and k = 3
    Output: [5,6,7,1,2,3,4]
    Explanation:
    rotate 1 steps to the right: [7,1,2,3,4,5,6]
    rotate 2 steps to the right: [6,7,1,2,3,4,5]
    rotate 3 steps to the right: [5,6,7,1,2,3,4]
    

    Example 2:

    Input: [-1,-100,3,99] and k = 2
    Output: [3,99,-1,-100]
    Explanation: 
    rotate 1 steps to the right: [99,-1,-100,3]
    rotate 2 steps to the right: [3,99,-1,-100]
    

    Note:

    • Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
    • Could you do it in-place with O(1) extra space?

    in-place, O(1) extra space

    先reverse前n-k个元素,再reverse后k个元素,再reverse整个数组

    e.g. [1,2,3,4,5,6,7], k = 3 :-> [4,3,2,1,5,6,7] -> [4,3,2,1,7,6,5] -> [5,4,7,1,2,3,4]

    注意k有可能大于数组的长度,用mod找到最小的k

    time: O(n), space: O(1)

    class Solution {
        public void rotate(int[] nums, int k) {
            if(nums == null || nums.length == 0) return;
            int n = nums.length;
            k = k % n;
            reverse(nums, 0, n-1-k);
            reverse(nums, n-k, n-1);
            reverse(nums, 0, n-1);
        }
        
        private void reverse(int[] nums, int start, int end) {
            while(start <= end) {
                int tmp = nums[start];
                nums[start] = nums[end];
                nums[end] = tmp;
                start++;end--;
            }
        }
    }

    二刷:

    class Solution {
        public void rotate(int[] nums, int k) {
            if(nums == null || nums.length == 0) {
                return;
            }
            int n = nums.length;
            k = k % n;
            reverse(nums, 0, n - 1);
            reverse(nums, 0, k - 1);
            reverse(nums, k, n - 1);
        }
        
        private void reverse(int[] arr, int i, int j) {
            while(i < j) {
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                i++;
                j--;
            }
        }
    }
  • 相关阅读:
    centos安装Libzip
    PHP安装
    DWZ主从表界面唯一性验证(自写js)(一)
    JSTL的if...else项目小试
    分享:忙了一辈子,才知道什么是你的
    JSTL时间格式化项目小试
    eclipse中去掉validate的方法
    Java初学者必学的JSTL
    (转)Java程序员应该知道的10个调试技巧
    为什么那些美事没有实现---生活中小事有感
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10090166.html
Copyright © 2011-2022 走看看