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--;
            }
        }
    }
  • 相关阅读:
    快速开发框架:进销存业务注意事项
    延时执行函数:前浪死在沙滩上
    新增筛选方案
    进销存数据库设计:采购订单
    SasS 设计原则十二因素
    四种线程池的解析
    高并发下的流量控制
    Mybatis 缓存机制
    谈谈JVM垃圾回收
    如何使错误日志更加方便地排查问题
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10090166.html
Copyright © 2011-2022 走看看