力扣(C++): 旋转数组

问题描述

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

示例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]

代码示例:

class Solution {
public:
#if 0
	void rotate(vector<int>& nums, int k) {
		int len = nums.size();
		k %= len;
		vector<int> res(len, 0);
		int j = 0;
		for (int i = len - 1 - k; i < len; ++i)
		{
			res[j++] = nums[i];
		}
		for (int i = 0; i < len - 1 - k; ++i)
		{
			res[j] = nums[i];
			j++;
		}
	}
#elif 0
	void rotate(vector<int>& nums, int k) {
		int len = nums.size();
		k %= len;
		vector<int> tmp;
		tmp = nums;
		for (int i = 0; i < len; ++i)
		{
			tmp[(i + k) % len] = nums[i];
		}
		for (int i = len - 1; i > k - 1; --i)
		{

			nums[i] = nums[i - k];
		}
		for (int i = 0; i < k; ++i)
		{
			nums[i] = tmp[i];
		}
	}
#elif 0
	//时间复杂度较高
	//逐个右移
	void rotate(vector<int>& nums, int k) {
		int len = nums.size();
		int last = nums[len - 1];
		for (int i = 0; i < k; ++i)
		{
			for (int j = len - 1; j > 0; --j)
			{
				nums[j] = nums[j - 1];
			}
			nums[0] = last;
			last = nums[len - 1];
		}
	}
#elif 1
	//数组整体翻转, 再根据k值分段翻转
	void reverseArr(vector<int> & num, int left, int right)
	{
		while (left < right)
		{
			int tmp = num[left];
			num[left] = num[right];
			num[right] = tmp;
			left++;
			right--;
		}
	}
	void rotate(vector<int>& nums, int k) {
		int len = nums.size();
		k %= len;
		reverseArr(nums, 0, len - 1);
		reverseArr(nums, 0, k - 1);
		reverseArr(nums, k, len - 1);
	}

#endif
};
发布了235 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44781107/article/details/103896796