力扣 189. 轮转数组

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


目录

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

分析图解:

代码如下:

2.额外开数组

图解分析:

代码如下: 

3.三趟逆置 

图解分析:

 代码如下:

总结


题干如下:

力扣 189. 轮转数组_第1张图片

力扣 189. 轮转数组_第2张图片  

并且后面还有进阶内容:

力扣 189. 轮转数组_第3张图片

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

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

分析图解:

力扣 189. 轮转数组_第4张图片  

代码如下:

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

}

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

2.额外开数组

图解分析:

力扣 189. 轮转数组_第5张图片 

代码如下: 

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

3.三趟逆置 

图解分析:

力扣 189. 轮转数组_第6张图片

 代码如下:

void rotate(int* nums, int numsSize, int k){
	k = k%numsSize;
	//对n-k个进行逆置
	int left = 0;
	int right = numsSize - k - 1;
	while (left

总结

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

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

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

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

你可能感兴趣的:(刷题笔记,leetcode,算法,职场和发展)