数据结构初阶-时间复杂度

这篇博客讨论了在编程考虑时间复杂度的两个例子

1.消失的数字

数组 nums 包含从 0n 的所有整数,但缺少了其中一个。请编写代码找出那个缺失的整数。你有办法在 O(n) 时间内完成吗?
示例1:
输入: [3,0,1] 
输出:2

示例2:
输入: [9,6,4,2,3,5,7,0,1] 
输出:8

我们可以想到如下几种方法:

方法1:首先利用 qsort() 函数进行排序,进而找出缺少的数字
时间复杂度 O(n*log2N) 
方法2:利用 (1+2+3+...+n)-(nums[0]+nums[2]+...+num[n-1])
时间复杂度 O(N) 空间复杂度 O(1)
方法3:利用数组中是几就在第几个位置记录下这个值
时间复杂度 O(N) 空间复杂度 O(N)
方法4:先给定一个值 x = 0; x 先跟 [0-n] 的所有值异或,x 再跟数组中每个值异或,最后 x 就是缺的那个数字。
时间复杂度 O(N) 空间复杂度 O(1)
综上,一道题有多种方法求解,我们只需分析出每种方法复杂度,进而选择复杂度最优的方法即可,这便是复杂度的实际意义。由此我们可以看到方法 2 和方法 4 最好。我们在此处给出了方法  4 的参考代码:
#include 
#include 

int missingNumber(int* nums, int numsSize)
{
	int x = 0;
	for (int i = 0; i <= numsSize; i++)
	{
		x ^= i;//与0-n异或
	}
	
	for (int i = 0; i < numsSize; i++)
	{
		x ^= nums[i];//与数组中的值异或
	}

	return x;
}

int main()
{
	int arr[] = { 8,7,4,2,3,5,6,0,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = missingNumber(arr, sz);
	printf("缺少的数字为: %d\n",ret);

}

2.旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数,尽可能的想出更多的解决方案,至少有三种不同的方法可以解决这个问题;你可以使用空间复杂度为 O(1) 的原地算法来解决这个问题吗?

示例1:
输入: nums = [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]

我们可以想到如下几种方法:

方法1:暴力求解,旋转 k
时间复杂度 O(N*k) 空间复杂度 O(1)
方法2:开辟额外空间, 以空间换时间,前 k 个,n-k 个依次放入新数组,最后再拷贝回原数组
时间复杂度 O(N) 空间复杂度 O(N)
方法3:1 2 3 4 5 6 7 ,k=3
             4 3 2 1 5 6 7    前n-k逆置
             4 3 2 1 7 6 5    后k个逆置
             5 6 7 1 2 3 4    整体逆置
时间复杂度 O(N) 空间复杂度 O(1)
我们给出了方法3的具体代码,如下:
#include 
#include 

void Reverse(int* nums, int left, int right)
{
	while (left < right)
	{
		int temp = nums[left];
		nums[left] = nums[right];
		nums[right] = temp;
		++left;
		--right;
	}
}

void rotate(int *nums, int numsSize, int k)
{
	if (k >= numsSize)
		k %= numsSize;
	
	Reverse(nums, 0, numsSize - k - 1);//前n-k个数逆置
	
	Reverse(nums, numsSize - k, numsSize - 1);//后k个数逆置
	
	Reverse(nums, 0, numsSize - 1);//整体逆置
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7 };
	int k = 3;
	int sz = sizeof(arr) / sizeof(arr[0]);
	rotate(arr, sz, k);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ",arr[i]);
	}
}

结束!

你可能感兴趣的:(数据结构)