时间复杂度必备的两道笔试题(附图解)
前言
`
本文介绍Leedcode中数据结构时间复杂度的两道笔试题!
一、第一题
1.题目
题目如下(示例):
数组nums包含从0到n的所有整数,但其中缺了一个。用代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
2.讲解(图解+代码)
一道题有多种方法,我们只需要分析出每种方法的复杂度,选择复杂度最优的方式即可!
1.思路一:qsort快排,时间复杂度为O(n*log2^N),不符合题意。
2.思路二:数组中值是几就在第几个位置写一下这个值(空间)空间复杂度为O(N),不符合题意!
3.思路三:( 0+1+2+…+n )- ( a[0] + a[1] + a[2] +…a[n-1] )
注意:时间复杂度为O(N) , 空间复杂度为O(1),符合题意~
代码如下(示例):
#include<math.h>
int missingNumber(int nums[], int numsSize)
{
int i = 0;
int sum = 0;
for (i = 0; i <= numsSize; i++)
{
sum += i;
}
int tmp = 0;
for (i = 0; i <= numsSize-1; i++)
{
tmp += nums[i];
}
return (sum - tmp);
}
int main()
{
int arr[] = {0,1,2,6,5,4};
int sz = 3;
int ret = missingNumber(arr, sz);
printf("缺的数字是:%d\n", ret);
}
4.思路四:先和0到n的数异或后再和数组中的值异或!时间复杂度:O(N)
代码如下(示例):
int missingNumber(int* nums, int numsSize){
int x=0;
for(int i=0;i<=numsSize;i++)
{
x^=i;
}
for(int i=0; i< numsSize;i++)
{
x ^= nums[i];
}
return x;
}
int main()
{
int arr[] = {3,0,1};
int sz = 3;
int ret = missingNumber(arr, sz);
printf("缺的数字是:%d\n", ret);
}
二、第二题
1.题目
代码如下(示例):
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
2.讲解(图解+代码)
假设输入nums={1,2,3,4,5,6,7},k=3。输出:【5,6,7,1,2,3,4】
1.思路一:(1)向右旋转一步:[7,1,2,3,4,5,6] --(2)向有旋转两步–(3)向右旋转三步。
这种方法的时间复杂度为O(N*k),空间复杂度为O(1),不符合题意
2.思路二: (1)前n-k个逆置–(2)后k个逆置–(3)整天逆置。时间复杂度为O(N),空间复杂度O(N)
这里采用的是开辟额外空间,以空间换时间!符合题意
代码如下(示例):
void reverse_string(int* nums, int left, int right)
{
while (left < right)
{
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k) {
//如果k=0或者k>numsSize的情况
k = k % numsSize;
//逆序n-k个字符串前面
reverse_string(nums, 0, numsSize - k - 1);
//逆序剩下的字符串后面
reverse_string(nums, numsSize - k, numsSize - 1);
//整体逆序字符串
reverse_string(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);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
总结
以上就是今天要讲的内容,本文介绍了时间复杂度必备的两道笔试题,如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!