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

力扣HOT100之普通数组:189. 轮转数组


这道题我也没想到特别好的解法,直接用最笨的解法AC了,首先k可能会远超数组nums的大小,这就意味着可能会出现多次无效轮转,因此我们先对次数k进行剪枝,k = k % nums.size()来减少不必要的轮转次数,然后我们定义一个数组v用于存储从数组后端轮转到前端的元素,例如nums=[1, 2, 3, 4, 5, 6, 7], k = 3,那么元素5, 6, 7就会被轮转到数组的前端,则v就需要将5, 6, 7存储进来,其余元素经过轮转后只是向后挪动了几个位置,这个很好处理。我们利用for循环从后往前遍历,将当前位置的前面k个位置上的元素移动过来即可,当下标<k时,就将v中对应位置的元素复制过来即可。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k = k % nums.size();  //剪枝避免多余的轮转
        vector<int> v;
        for(int i = nums.size() - k; i < nums.size(); ++i)
            v.emplace_back(nums[i]);
        for(int i = nums.size() - 1; i >= 0; --i){
            if(i >= k) nums[i] = nums[i - k];
            else nums[i] = v[i];
        }
    }
};

看了下灵神的题解,感觉他的思路比较有泛化性,三次反转的思路可以应用在轮转的问题上,主要是看下三次反转为什么可以实现轮转的效果,这里直接看灵神的证明就好了,我觉得还蛮通俗易懂的。

灵神也提到了剪枝的问题,为了避免无效的轮转,我们需要先对k取模再进行反转。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k = k % nums.size();  //剪枝避免多余的轮转
        reverse(nums.begin(), nums.end());  //反转数组中的所有元素
        reverse(nums.begin(), nums.begin() + k);  //反转前k个元素
        reverse(nums.begin() + k, nums.end());   //反转后n - k个元素
    }
};

相关文章:

  • 算法250327题目
  • C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷五)
  • 如何快速对比两个不同的excel文件中的单元格的数据是否完全相同 并把不同的单元格的背景颜色更改为红色?
  • MySQL索引优化与应用指南
  • 【电子通识】铅笔硬度简史:从石墨到工业标准
  • 香港QILSTE/旗光 H6-108QLB高亮LED灯珠
  • AnimateCC技术教学:使用后台JavaScript修改ballObj实例的填充色为径向渐变色-由DeepSeek产生
  • 【踩坑系列】使用httpclient调用第三方接口返回javax.net.ssl.SSLHandshakeException异常
  • 【位运算】268. 丢失的数字
  • 深度讨论Python for循环
  • SQL Server安装过程中提示 .NET Framework 4.8 缺失
  • 【cocos creator 3.x】3Dui创建,模型遮挡ui效果
  • RocketMQ 底层原理
  • 什么是uv 和pip的区别是什么
  • 深入掌握Linux ip命令:网络配置与管理的瑞士军刀
  • Scala基础语法与简介
  • [OS_4] 数学视角 | 多状态 | 模型检查器 | 程序验证(math)
  • 掌握文件权限:理解Linux chmod
  • XS2105S/M——IEEE 802.3af/at 兼容、用电设备接口控制器集成功率 MOSFET,可替代TMI7302A/D和SD4923
  • MDC的原理是什么?
  • 中山 网站关键词优化/seo外链在线工具
  • 合肥网站建设网站推广/合肥百度搜索排名优化
  • 资海网络一年做多少网站/成都网站seo技术
  • logo图片大全简单/淮北seo
  • 长春作网站建设的公司/有什么推广产品的渠道
  • 电商网站的模式/拼多多代运营一般多少钱