力扣 189. 轮转数组

本次例题为leetcode中的题目,做题链接附上:力扣


目录

1.将尾数保存,所有值从前向后覆盖,再将首值替换为保存的那个值

分析图解:

代码如下:

2.额外开数组

图解分析:

代码如下: 

3.三趟逆置 

图解分析:

 代码如下:

总结


题干如下:

  

并且后面还有进阶内容:

这里我们用三种方法来解决它。

1.将尾数保存,所有值从前向后覆盖,再将首值替换为保存的那个值

分析图解:

  

代码如下:

void rotate(int* nums, int numsSize, int k){
	k = k%numsSize;
	for (int i = 0; i<k; i++)
	{
		int num = nums[numsSize - 1];
		for (int j = numsSize - 1; j>0; j--)
		{
			nums[j] = nums[j - 1];
		}
		nums[0] = num;
	}

}

结果:超出时间限制,leetcode过不了

2.额外开数组

图解分析:

 

代码如下: 

void rotate(int* nums, int numsSize, int k){
	//创建一个数组
	int*nums1 = (int*)malloc(numsSize*sizeof(int));
	k = k%numsSize;
	//将后k个值直接放入新数组的前k个中
	int a = k;
	for (int i = numsSize; i>numsSize - k; i--)
	{
		nums1[a - 1] = nums[i - 1];
		a--;
	}
	//将前面的值放入新数组的后面
	int b = 0;
	for (int j = k; j<numsSize; j++)
	{
		nums1[j] = nums[b];
		b++;
	}
	//将新数组替换为原数组
	for (int c = 0; c<numsSize; c++)
	{
		nums[c] = nums1[c];
	}
}

3.三趟逆置 

图解分析:

 代码如下:

void rotate(int* nums, int numsSize, int k){
	k = k%numsSize;
	//对n-k个进行逆置
	int left = 0;
	int right = numsSize - k - 1;
	while (left<right)
	{
		int temp = nums[right];
		nums[right] = nums[left];
		nums[left] = temp;
		left++;
		right--;
	}
	//对后k个进行逆置
	left = numsSize - k;
	right = numsSize - 1;
	while (left<right)
	{
		int temp = nums[right];
		nums[right] = nums[left];
		nums[left] = temp;
		left++;
		right--;
	}
	//对整体进行逆置
	left = 0;
	right = numsSize - 1;
	while (left<right)
	{
		int temp = nums[right];
		nums[right] = nums[left];
		nums[left] = temp;
		left++;
		right--;
	}
}

总结

从三种方法的空间复杂度和时间复杂度来看:

第一种时间复杂度为O(n^2),空间复杂度为O(1),做题时不建议使用,时间超出限制。

第二种时间复杂度为O(n),空间复杂度为O(n),可以跑过去。

第三种时间复杂度为O(n),空间复杂度为O(1),三趟逆置法为最优解。

  • 18
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今年依旧去年春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值