【数据结构】时间复杂度---OJ练习题

简介: 【数据结构】时间复杂度---OJ练习题

🌴时间复杂度练习



🙊 如果有不了解时间复杂度的请移步上一篇文章:【数据结构】初识


📌面试题--->消失的数字


题目描述


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


题目链接:面试题 17.04. 消失的数字


示例 1:


输入:

[3,0,1]


输出:

2


输入:

[9,6,4,2,3,5,7,0,1]


输出:

8


🌴解题思路



📌思路1:


1.开辟一个额外的N+1个数的数组(即malloc一个额外N+1个数的数组),建立一个映射关系,,将数组的值全部初始化为-1
2.遍历这些数字,这个数是多少就写到数组的对应位置

3.再遍历一遍数组,哪个位置是-1,哪个位置的下表就是缺失的数字

因为malloc数组基本没有时间消耗,但是初始化时需要循环N+1次,填数字的时候也循环了N+1次,最后遍历时最坏也要循环N+1次,总共3N+3次,根据大O的渐进表示法就知道时间复杂度O(N)。

时间复杂度是:O(N)


代码展示:

int missingNumber(int* nums, int numsSize){
     int* p = (int*)malloc((numsSize+1) * sizeof(int));
     for(int i=0;i<=numsSize;i++)
     {
         p[i]=-1;
     }
     for(int i=0;i<numsSize;i++)
     {
         p[nums[i]]=nums[i];
     }
     for(int i=0;i<=numsSize;i++)
     {
         if(p[i]==-1)
         {
             free(p);
             return i;
         }
     }
     free(p);
     return -1;
}


结果:

9ccb762562bc40778b78649864a62dae.png


malloc函数用法


函数声明:

void *malloc(size_t size)


头文件:<stdlib.h>

参数:

size --- 内存块的大小,以字节为单位。


返回值:

该函数返回一个指针 ,指向已分配大小的内存。为避免内存泄漏,必须用 free() 或 realloc() 解分配返回的指针。如果请求失败,则返回 NULL。


示例:

1. double * pt;
2. pt = (double * ) malloc (30 * sizeof(double));


这段代码请求30个double类型值的空间,并且让pt指向该空间所在位置。

在释放空间时只需如下操作:


free(pt);


📌思路2:


异或:------>符号:^

用一个 x = 0,x跟数组中的这些数据都异或一遍,

然后再跟0-N之间的数字异或一遍,最后x才是缺失的数字。

注意:❗️0^x = x       ❗️ a^a = 0

          ❗️异或满足交换律和结合律(即1^2^3^1^2 = 1^1^2^2^3 =3)

因为第一遍异或时需要循环N次,第二遍也需要N次,总共2N次,根据大O的渐进表示法就知道时间复杂度为O(N)。


时间复杂度:O(N)


代码展示:

int missingNumber(int* nums, int numsSize){
    int x=0;
    for(int i = 0;i < numsSize; ++i)
    {
        x ^= nums[i];
    }
    for(int j = 0;j < numsSize+1; ++j)
    {
        x ^= j;
    }
    return x;
}


注意: 这里* nums表示存放0-N中缺失了一个数字后的所有数字的数组,一共有numsSize个,而0-N之间一共有numsSize+1个数。


结果:

214d233ec27e4218a0ac242f963bea4d.png


📌思路3:


公式计算:

1.求0-N这些数的和(利用求和公式)

2.再求数组中存放的这些数的和(用for循环)

3.将第一次求的和减去第二次求的和即为缺失的数字

因为第一次求和使用公式所以基本不消耗时间,第二次求和进行了N次循环,总共N次,根据大O的渐进表示法就知道时间复杂度为O(N)。

时间复杂度:O(N)


代码展示:

int missingNumber(int* nums, int numsSize){
int sum = ((numsSize + 1) * numsSize) / 2;
for (int i = 0;i< numsSize; ++i)
{
    sum -=*(nums+i);
}
return sum;
}


结果:

ba08cee3043443f4a7ec0d1bad4aa798.png

🔥今天的分享就到这里,如果觉得博主的文章还不错的话,请👍三连支持一下博主哦🤞


image.png






目录
相关文章
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
38 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
2月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
26 7
|
2月前
|
算法
[数据结构] -- 时间复杂度和空间复杂度
[数据结构] -- 时间复杂度和空间复杂度
16 0
|
5月前
【数据结构OJ题】环形链表
力扣题目——环形链表
39 3
【数据结构OJ题】环形链表
|
5月前
|
存储 索引
【数据结构OJ题】设计循环队列
力扣题目——设计循环队列
38 1
【数据结构OJ题】设计循环队列
|
5月前
【数据结构OJ题】有效的括号
力扣题目——有效的括号
39 1
【数据结构OJ题】有效的括号
|
5月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
54 1
【数据结构OJ题】复制带随机指针的链表
|
5月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
34 1
【数据结构OJ题】环形链表II
|
5月前
【数据结构OJ题】相交链表
力扣题目——相交链表
37 1
【数据结构OJ题】相交链表
|
5月前
【数据结构OJ题】合并两个有序链表
力扣题目——合并两个有序链表
43 8
【数据结构OJ题】合并两个有序链表