• [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--;
            }
        }
    }
  • 相关阅读:
    2015上海网络赛 A Puzzled Elena
    容斥原理——uva 10325 The Lottery
    2015北京网络赛B题 Mission Impossible 6
    2015北京网络赛A题The Cats' Feeding Spots
    POJ3087——map——Shuffle'm Up
    POJ3126——BFS——Prime Path
    POJ1426——BFS——Find The Multiple
    算法总结——Prim
    算法总结——Dijkstra
    算法总结——Floyed
  • 原文地址:https://www.cnblogs.com/Moriarty-cx/p/9807691.html
Copyright © 2020-2023  润新知