0
点赞
收藏
分享

微信扫一扫

力扣 189. 轮转数组

千白莫 2022-03-12 阅读 81

本次例题为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),三趟逆置法为最优解。

举报

相关推荐

0 条评论