189. 轮转数组
189. 轮转数组
给你一个数组,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
示例 1:
[5,6,7,1,2,3,4]
[7,1,2,3,4,5,6]
[6,7,1,2,3,4,5]
[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)
的 原地 算法解决这个问题吗?
解析:
设起点为下标位置0,临时变量保存起点的值,每次计算出是哪个位置的值要放到当前位置,然后直接放即可
遍历数组,以每个i为起点进行一次上述操作,那如何记录当前下标已经执行过了呢?
每次执行操作之前,先遍历一遍这个环,如果里面有小于起点的下标,则说明已经当前下标已经操作完了
当然这样为O(n^2),用cnt表示当前总共已经操作了多少个数,每次用cnt1记录当前操作的数量
cnt += cnt1,如果cnt == n,则说明数组完成操作
class Solution { public: bool check(int s, int n, int k) { int nx = (s + k) % n; while(nx > s) { nx = (nx + k) % n; } if(nx < s) return 0; return 1; } void rotate(vector<int>& nums, int k) { int n = nums.size(); k = k % n; int cnt = 0; for(int i = 0; i < nums.size(); i++) { if(!check(i, n, k)) continue; int cnt1 = 1; int orig = nums[i]; int prex = i - k; int lastx = i; if(prex < 0) prex += n; while(prex != i) { cnt1++; nums[lastx] = nums[prex]; lastx = prex; prex -= k; if(prex < 0) prex += n; } nums[lastx] = orig; cnt += cnt1; if(cnt == n) break; } } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2021-10-07 剑指 Offer II 047. 二叉树剪枝
2021-10-07 剑指 Offer II 049. 从根节点到叶节点的路径数字之和
2018-10-07 平面最近点对
2018-10-07 欧拉回路总结