LeetCode189:旋转数组

本文深入探讨了一种常见的数组操作——数组元素的右移旋转。通过示例详细解析了如何通过三次反转实现数组旋转,适用于任意长度的数组和旋转步数。文章提供了完整的代码实现,并讨论了处理边界情况的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

示例 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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值