翻转法实现旋转数组
简介:记录旋转数组的一种奇妙实现方法
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;
}
}

浙公网安备 33010602011771号