博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode - 旋转数组
阅读量:4177 次
发布时间:2019-05-26

本文共 1364 字,大约阅读时间需要 4 分钟。

题目描述:

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

       示例:

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

❗解决思路❗:

? 1、刚开始,按照解释的步骤一步步走,基础例子能通过,但数组长度非常之大时,会超时。

class Solution {public:    void rotate(vector
& nums, int k) { for (int i = 0; i < k; ++i) { int temp = nums[nums.size()-1]; for (int j = nums.size() - 1; j > 0; --j) { nums[j] = nums[j-1]; } nums[0] = temp; } }};

 ? 2、这道题可以找一找规律,走 k 步的结果是什么呢?我们可以看到,走 k 步后,数组后 k 个数走到了数组的最前面,其余的数字依次后移。想一想,也就是说,数组的前 k 个数变成了数组的后 k 个数,且不考虑这 k 个数的顺序,我们怎么可以做到这一点呢?就是把数组整体翻转。 ( [1, 2, 3, 4, 5, 6, 7] → [7, 6, 5, 4, 3, 2, 1] )

       经过上面的步骤后,我们发现,前 k 个数和后面 len-k 个数,其顺序完全颠倒,所以我们又可以将前 k 个数进行一次翻转,后 len-k 个数进行一次翻转。( [7, 6, 5, 4, 3, 2, 1] → [5, 6, 7, 1, 2, 3, 4] )

       题目中已经说了 k 是非负数,所以我们不需要考虑这种情况了。但还有一点要注意,k 的大小和数组长度 len 的大小关系,所以在进行翻转之前,先要进行一步运算:k = k % nums.size()

class Solution {public:    void rotate(vector
& nums, int k) { //reverse(nums, 0, nums.size()-1); //reverse(nums, 0, k-1); //reverse(nums, k, nums.size()-1); // 防止 k > nums.size() k = k % nums.size(); reverse(nums.begin(), nums.end()); reverse(nums.begin(), nums.begin() + k); reverse(nums.begin()+k, nums.end()); return; }};

转载地址:http://lstai.baihongyu.com/

你可能感兴趣的文章
QtChart x坐标轴是时间坐标
查看>>
QT QByteArray一个不小心的坑 char转int
查看>>
Linux 使用system不安全,有时触发,有时不触发,替代函数如下
查看>>
QT 中文乱码的解决方案
查看>>
linux程序设计 socket本地客户端连本地服务器一直报找不到文件
查看>>
长期运行linux设备,进程意外崩溃解决方案 - 软件看门狗
查看>>
学习别人如何介绍产品
查看>>
mount -t cifs 提示no such device错误
查看>>
VS打开项目卡顿的解决方案,正在扫描#includes 寻找其他文件
查看>>
git安全访问,使用公钥和私钥来访问github
查看>>
git拉下来的项目文件夹没有图标
查看>>
TortoiseGit入门
查看>>
VS2012 VS2015 VS2019 拖动窗口布局VS崩溃卡住
查看>>
Beyond Compare右键菜单不能出现修复
查看>>
Enterprise Architect 12 快速入门一
查看>>
Qt 加快编码的一些快捷键技巧
查看>>
QT 三种关联信号和槽的办法
查看>>
Qt显示图片,QLabel加载图片两种方法
查看>>
Qt窗体布局管理器 QFormLayout
查看>>
Qt布局里重要的三个概念
查看>>