当前位置:   article > 正文

[LeetCode]力扣189.轮转数组_189. 轮转数组

189. 轮转数组

 

目录

题目189. 轮转数组

方法一:创建新的数组,使用额外的空间  

图解:

代码

方法二:右旋(不能oj)

图解:

代码

方法三:翻转

图解:

代码


题目189. 轮转数组

189. 轮转数组 - 力扣(LeetCode)

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [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:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

进阶:

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

方法一:创建新的数组,使用额外的空间  

创建新的数组,使用额外的空间   

模运算 实现轮转

轮转后数据存储到newArray
重新赋给nums

图解:

代码

  1. void rotate(int* nums, int numsSize, int k) {
  2. int newArray[numsSize];//创建新的数组,使用额外的空间
  3. for (int i = 0; i < numsSize; i++){
  4. //模运算 实现轮转
  5. //轮转后数据存储到newArray
  6. newArray[(i + k) % numsSize] = nums[i];
  7. }
  8. for(int i = 0;i < numsSize; i++){
  9. //重新赋给nums
  10. nums[i] = newArray[i];
  11. }
  12. }

方法二:右旋(不能oj)

但是消耗时间过长,无法通过!!!

图解:

代码

  1. void rotate(int* nums, int numsSize, int k) {
  2. int temp = 0;
  3. k = k % numsSize;
  4. while(k > 0){
  5. temp = nums[numsSize - 1];
  6. for(int i = numsSize - 1; i > 0;i--){
  7. nums[i] = nums[i - 1];
  8. }
  9. nums[0] = temp;
  10. k--;
  11. }
  12. }

方法三:翻转

图解:

代码

  1. void rotate(int* nums, int numsSize, int k) {
  2. int* temp = (int*)malloc(sizeof(int) * numsSize);
  3. int n = numsSize;
  4. k %=numsSize;//控制k大小
  5. memcpy(temp,nums + n -k, sizeof(int) * k);//拷贝nums的后k个数据
  6. memcpy(temp + k, nums, sizeof(int) *(n-k));//拷贝nums的前 n-k个数据
  7. memcpy(nums, temp,sizeof(int)* numsSize);//拷贝回去
  8. free(temp);
  9. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/856208
推荐阅读
相关标签
  

闽ICP备14008679号