LeetCode189:旋转数组

给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

示例 1:

输入:  [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]

示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释: 
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

解析:

        该题目是一个常见的题目,主要的做法就是分别旋转k前的所有元素,k及k以后的所有元素,然后旋转所有元素就实现了整个数组的旋转。但是有两个需要注意的点,1、如果数组为空或只有一个元素,则直接返回即可。2、如果k的值大于数组的长度,这样就可能导致数组转了多圈,所以用k-nums.size()直到k的值小于数组长度。

代码:

void reverse(vector<int>& nums, int start, int end)
{
	if (nums.empty())
		return;
	for (int i = start, j = end; i < j; i++, j--)
	{
		int tmp = nums[i];
		nums[i] = nums[j];
		nums[j] = tmp;
	}
}

void rotate(vector<int>& nums, int k) 
{
	if (nums.empty() || nums.size() == 1)
		return;
	while (k > nums.size())
	{
		k -= nums.size();
	}
	reverse(nums, 0, nums.size() - k - 1);
	reverse(nums, nums.size() - k, nums.size() - 1);
	reverse(nums, 0, nums.size() - 1);
}

猜你喜欢

转载自blog.csdn.net/qq_36214481/article/details/84960723