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--;
            }
        }
    }
  • 相关阅读:
    Conventional and Direct Path Loads
    [转]Oracle DB RMAN 简单配置
    [转]Oracle DB 使用快速恢复区
    增量备份,11g052题目解析
    [转]Oracle DB 使用RMAN执行恢复
    [转]Oracle DB 备份和恢复的概念
    [转]Oracle DB 管理数据并发处理
    [转]Oracle DB管理内存
    [转]Oracle 并行原理与示例总结
    [转]Oracle DB审计
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10090166.html
Copyright © 2011-2022 走看看