题目描述
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。使用空间复杂度为 O(1)
的 原地 算法解决这个问题
示例 1:
输入: nums = [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个数字置换到前面,可以采用翻转的思路求解,先翻转整个数组,发现后k个数移动到了前面,但为逆序,于是继续翻转前k个数,同理,剩下的数也为逆序继续翻转,最后实现轮转的效果。
代码实现
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k=k%nums.size();//轮转一圈回到原地,取余可以减少执行时间
reverse(nums,0,nums.size()-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.size()-1);
}
void reverse(vector<int> &nums,int start,int end){
while(start<end){
swap(nums[start],nums[end]);//交换函数
// int a=nums[start];
// nums[start]=nums[end];
// nums[end]=a;
++start;
--end;
}
}
};
相关知识
1、reverse函数
在 C++ 中,std::reverse()
是一个算法函数,用于反转某个范围内的元素顺序。该函数可用于反转数组、向量和字符串等可迭代容器。
std::reverse()
函数的声明如下:
template< class BidirIt >
void reverse( BidirIt first, BidirIt last );
其中,BidirIt
是一个迭代器类型,表示可以双向遍历的迭代器。
该函数接受两个参数 first
和 last
,表示要反转的元素范围。first
是指向待反转范围的第一个元素的迭代器,last
是指向待反转范围的最后一个元素的下一个位置的迭代器。
2、swap函数
在 C++ 中,std::swap()
是一个标准库函数,用于交换两个对象的值。它接受两个参数,并通过引用将它们的值进行交换。
std::swap()
函数的声明如下:
template< class T >
void swap( T& a, T& b );
其中,T
是对象的类型。函数接受两个参数 a
和 b
,并使用引用将它们的值进行交换。