翻转法实现旋转数组

简介:记录旋转数组的一种奇妙实现方法

1.题目

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

2.思路

设原数组为{1,2,3,4,5,6,7},k=3,目标为{5,6,7,1,2,3,4,5};
首先翻转整个数组得{7,6,5,4,3,2,1};
再翻转前k个数得{5,6,7,4,3,2,1};
最后翻转坐标为[k]到[n-1]的数组得{5,6,7,1,2,3,4};

3.时空复杂度

时间复杂度:O(n);
空间复杂度:O(1);

4.code

void rotate(vector<int>& nums, int k) {
int n=nums.size();
//优化:k等于数组长度n时,右移k等价于不移动,故可以通对k取余来优化算法
k=k%n;
//整体翻转
reverse(nums,0,n-1);
//翻转前k个数
reverse(nums,0,k-1);
//翻转后面的数
reverse(nums,k,n-1);
}
//翻转一段数组的实现
void reverse(vector<int>& nums,int start,int end){
while(start<end){
swap(nums[start],nums[end]);
start+=1;
end-=1;
}
}
posted @   0wwlww0  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示