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

    url: https://leetcode.com/problems/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?

    解决方案

    /**
    * 一个数组,比如nums=[1,2,3]:
    * 如果rotate的次数k=其长度自身,那么数组不变 ([3,1,2], [2,3,1], [1,2,3]);
    * 如果rotate的次数k>其长度自身,那么数组的“有效”rotate次数是k%nums.length;
    * 如果rotate的次数k<其长度自身,先把要移到前面的放到另外的空间,剩余元素往后移动,再把之前移到另外空间的元素转移回来。
    */
    class Solution {
        public void rotate(int[] nums, int k) {
            if(nums == null || nums.length < 1){
                return;
            }
            //计算有效rotate次数
            if(k > nums.length){
                k = k % nums.length;
            }
            //直接返回
            if(k == nums.length){
                return;
            }
            
            int[] remain = new int[k];
            int j = 0;
            //先把要移到前面的放到另外的空间
            for(int i = nums.length - k; i < nums.length; ++i){
                remain[j] = nums[i];
                ++j;
            }
            //剩余元素往后移动
            for(int q = nums.length - k - 1; q >= 0; --q){
                nums[q+k] = nums[q];
            }
            //再把之前移到另外空间的元素转移回来。
            for(int p = 0; p < remain.length; ++p){
                nums[p] = remain[p];
            }
        }
    }
  • 相关阅读:
    Java学习二十九天
    Java学习二十八天
    47. Permutations II 全排列可重复版本
    46. Permutations 全排列,无重复
    subset ii 子集 有重复元素
    339. Nested List Weight Sum 339.嵌套列表权重总和
    251. Flatten 2D Vector 平铺二维矩阵
    217. Contains Duplicate数组重复元素
    209. Minimum Size Subarray Sum 结果大于等于目标的最小长度数组
    438. Find All Anagrams in a String 查找字符串中的所有Anagrams
  • 原文地址:https://www.cnblogs.com/frankcui/p/10476066.html
Copyright © 2011-2022 走看看