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

本文共 1380 字,大约阅读时间需要 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]

思路:

  比较浅显的就是提供一个只移动一位的接口,通过k取余数组的长度来得到最终的移动位数。然而这种做法的时间复杂度为O(kn),暂时想不出简单的解法,先试试看吧。

void rotate_one_step(vector
& nums){ int temp=std::move(nums[nums.size()-1]); for(int i=nums.size()-1;i>=1;--i) { nums[i]=std::move(nums[i-1]); } nums[0]=std::move(temp);}class Solution {public: void rotate(vector
& nums, int k) { int real_rotate=k%nums.size(); if(real_rotate==0) return; while(real_rotate--) { rotate_one_step(nums); } }};

  我们可以看到:虽然通过了,可结果惨不忍睹呢。来看看大佬的解法吧:

class Solution {public:    void rotate(vector
& nums, int k) { int len = nums.size(); k %= len; reverse(nums, 0, len - 1); reverse(nums, 0, k - 1); reverse(nums, k, len - 1); } void reverse(vector
& nums, int start, int end) { while (start < end) { int temp = nums[start]; nums[start++] = nums[end]; nums[end--] = temp; } }};

  可以看到,大佬采用了逆序的方法呢,使得复杂的降到O(n)。比如先前的示例,先对整个数组逆序为7654321。然后在分段逆序,对前面三个数逆序后567,对后四个逆序后1234,最后就是5671234。真的很巧妙呢。

 

转载于:https://www.cnblogs.com/manch1n/p/10305008.html

你可能感兴趣的文章
整理UWP中网络和设备信息获取的帮助类,需要的拿走。
查看>>
用户访问网站的流程
查看>>
重积分与曲线积分补充习题
查看>>
练手小游戏(一个开始
查看>>
基于unoconv的在线office预览
查看>>
[转]LCD驱动编写小结及BSWP 和 HWSWP的作用
查看>>
【转载】基数排序
查看>>
建造模式
查看>>
ny488 素数环
查看>>
linux命令初识
查看>>
禁止和允许被iframe
查看>>
用labview开发C语言的编译下载工具
查看>>
solr searcher
查看>>
paper 33 :[教程] 如何使用libsvm进行分类
查看>>
数据库应用设计设计报告
查看>>
在sz
查看>>
monkeyrunner 自动化 (通过脚本来实现对runner的控制)
查看>>
http常见状态码
查看>>
(贪心)School Marks -- codefor -- 540B
查看>>
redis优缺点
查看>>