zoukankan      html  css  js  c++  java
  • LeetCode 189. 旋转数组

    题目链接:https://leetcode-cn.com/problems/rotate-array/

    给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

    示例 1:

    输入: [1,2,3,4,5,6,7] 和 k = 3
    输出: [5,6,7,1,2,3,4]
    解释:
    向右旋转 1 步: [7,1,2,3,4,5,6]
    向右旋转 2 步: [6,7,1,2,3,4,5]
    向右旋转 3 步: [5,6,7,1,2,3,4]
    示例 2:

    输入: [-1,-100,3,99] 和 k = 2
    输出: [3,99,-1,-100]
    解释:
    向右旋转 1 步: [99,-1,-100,3]
    向右旋转 2 步: [3,99,-1,-100]
    说明:

    尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
    要求使用空间复杂度为 O(1) 的 原地 算法。

    如题:旋转三次即可,第一次整体旋转,第二三次分别旋转前半部分和后半部分,但是注意需要将k对数组长度取模

     1 void rotate(int* nums, int numsSize, int k){
     2     k=k%numsSize;
     3     int l=0,r=numsSize;
     4     for(int i=l;i<r/2;i++){
     5         int tmp=nums[i];
     6         nums[i]=nums[r-i-1];
     7         nums[r-i-1]=tmp;
     8     }
     9     l=0,r=k;
    10     for(int i=l;i<r/2;i++){
    11         int tmp=nums[i];
    12         nums[i]=nums[r-i-1];
    13         nums[r-i-1]=tmp;
    14     }
    15     l=k,r=numsSize-1;
    16     for(int i=l;i<(r+k+1)/2;i++){
    17         int tmp=nums[i];
    18         nums[i]=nums[r+k-i];
    19         nums[r+k-i]=tmp;
    20     }
    21 }
  • 相关阅读:
    2019.8.30 玉米田
    2019暑假集训 最短路计数
    2019暑假集训 旅行计划
    2019暑假集训 文件压缩
    0033-数字和星期转换
    0032-分数等级转换
    0031-闰年判断
    0030-购买衣服
    0029-求最小的数
    0028-判断奇偶
  • 原文地址:https://www.cnblogs.com/shixinzei/p/11366306.html
Copyright © 2011-2022 走看看