当前位置: 首页 > news >正文

LeetCode 189.轮转数组

189. 轮转数组

给定一个整数数组 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 <= 10⁵
  • -2³¹ <= nums[i] <= 2³¹ - 1
  • 0 <= k <= 10⁵

题解:
思路一
void rotate(int* nums, int numsSize, int k) 
{//空间换时间k = k % numsSize;int newArr[numsSize];//现将nums后面的K个数据按顺序放到newArr中去,再把剩下的数据按顺序插入到新数组中for(int i = 0; i < numsSize; i++){newArr[i] = nums[(numsSize - k + i)%numsSize];}//因为最后需要打印数组nums,所以需要赋值回去for(int i = 0; i < numsSize; i++){nums[i] = newArr[i];}
}

**结果:**不通过,时间复杂度过高,为 O ( N 2 ) O(N^2) O(N2)

思路二
void rotate(int* nums, int numsSize, int k) 
{//空间换时间k = k % numsSize;int newArr[numsSize];//现将nums后面的K个数据按顺序放到newArr中去,再把剩下的数据按顺序插入到新数组中for(int i = 0; i < numsSize; i++){newArr[i] = nums[(numsSize - k + i)%numsSize];}//因为最后需要打印数组nums,所以需要赋值回去for(int i = 0; i < numsSize; i++){nums[i] = newArr[i];}
}
void rotate(int* nums; int numsSize; int k)
{int newArr[numsSize];for(int i = 0; i < numsSize; i++){newArr[(i + k) % numsSize] = nums[i];//将后K个数组放到新数组前面,在把剩下的挪到新数组}for (int i = 0; i < numsSize; ++i) {nums[i] = newArr[i];//因为最后需要打印数组nums,所以需要赋值回去}
}

以上两组代码的代码逻辑基本一致,主要是在将数据移动到新数组时的具体实现思路不同。

//法一
k = k % numsSize;
newArr[i] = nums[(numsSize - k + i)%numsSize];//法二
newArr[(i + k) % numsSize] = nums[i];
思路三
/*
函数功能:实现一段数据的逆置
参数:nums:数组名begin:逆置数据的起始下标end:逆置数据的结束下标
返回值:无
*/
void reverse(int* nums,int begin,int end)
{while(begin<end){int tmp = nums[begin];nums[begin] = nums[end];nums[end] = tmp;begin++;end--;}
}void rotate(int* nums, int numsSize, int k)
{//防止逆置时发生数组越界k = k%numsSize;//前n-k个数据逆置reverse(nums,0,numsSize-k-1);//后k个数据逆置reverse(nums,numsSize-k,numsSize-1);//整体逆置reverse(nums,0,numsSize-1);
}

时间复杂度: O ( N ) O(N) O(N)

空间复杂度: O ( 1 ) O(1) O(1)

方法:

  • 前n - k个逆置:4 3 2 1 5 6 7
  • 后k个逆置:4 3 2 1 7 6 5
  • 整体逆置:5 6 7 1 2 3 4

相关文章:

  • 矩阵区域和 --- 前缀和
  • 使用Spring Boot实现WebSocket广播
  • 嵌入式开发面试常见编程题解析:pthread_join 与 pthread_detach 详解
  • 感受野(​​Receptive Field​​)
  • 高瓴资本张磊的顶级价值投资之道
  • SSR同构渲染深度解析
  • 实现在h5中添加日历提醒:safari唤起系统日历,其它浏览器跳转google日历
  • 阿里巴巴Qwen3发布:登顶全球开源模型之巅,混合推理模式重新定义AI效率
  • 选择AGV行业用的丝杆升降机时,需要考虑哪些因素?
  • Jupyter notebook快捷键
  • 飞蛾扑火算法优化+Transformer四模型回归打包(内含MFO-Transformer-LSTM及单独模型)
  • 高效 Transformer 的综述
  • Ansible 铸就 Linux 安全之盾(Ansible Builds Linux Security Shield)
  • 4、RabbitMQ的七种工作模式介绍
  • 算法备案类型解析:如何判断你的算法属于哪种类型?
  • 【动手学大模型开发】使用 LLM API:讯飞星火
  • ShenNiusModularity项目源码学习(25:ShenNius.Admin.Mvc项目分析-10)
  • Go语言Context机制深度解析:从原理到实践
  • 【angular19】入门基础教程(四):默认的css隔离作用域
  • 项目三 - 任务1:采用面向对象方式求三角形面积
  • 中吉乌铁路重点控制性工程开工建设,包括三座隧道
  • 2024“好评中国”网络评论大赛结果揭晓
  • 习近平就伊朗发生严重爆炸事件向伊朗总统佩泽希齐扬致慰问电
  • 王毅会见泰国外长玛里:坚决有力打击电诈等跨境犯罪
  • 西班牙葡萄牙遭遇史上最严重停电:交通瘫了,通信崩了,民众疯抢物资
  • 柳州警方通报临牌车撞倒行人:扣留涉事车辆,行人无生命危险