zoukankan      html  css  js  c++  java
  • [LeetCode] 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?

    题意:一个数组向右“移动”k位

    不额外开空间的情况下

    这题有个巧妙的算法,假设k小于length,那么移动后 就是后k位移到前k位 (假设k为3吧)

    1 2 3 4 5 6 7             

    5 6 7 1 2 3 4(应该得到的结果)

    我们把数组分开,后面的k位和前面的

    1 2 3 4   5 6 7

    然后各部分翻转

    4 3 2 1   7 6 5

    最后一起反转,就能把后k位翻到前面去

    5 6 7 1 2 3 4

    class Solution {
        public void rotate(int[] nums, int k) {
            if (nums.length == 0 || (k%(nums.length) == 0))
                return;
            int pos = k%nums.length;
    
            reverse(nums, 0, nums.length - pos - 1);
            reverse(nums, nums.length - pos, nums.length - 1);
            reverse(nums, 0, nums.length - 1);
        }
        public void reverse(int[] nums, int l, int r) {
            while (l < r) {
                int temp = nums[l];
                nums[l] = nums[r];
                nums[r] = temp;
                l++;
                r--;
            }
        }
    }
  • 相关阅读:
    docker将jar打包镜像文件
    特性阻抗(转)
    关于三极管偏置电路的思考
    怎样理解阻抗匹配?(转)
    你要包火到几时呢
    Bluetooth Note
    今年过年没回家
    第二天(tomcat与web程序结构与Http协议与HttpUrlConnection)
    JavaIO操作(1)转换流
    canphp框架功能与特性介绍
  • 原文地址:https://www.cnblogs.com/Moriarty-cx/p/9807691.html
Copyright © 2011-2022 走看看