【Leedcode】时间复杂度必备的两道笔试题(附图解)

时间复杂度必备的两道笔试题(附图解)



前言

`

本文介绍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;
}

在这里插入图片描述


总结

以上就是今天要讲的内容,本文介绍了时间复杂度必备的两道笔试题,如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
在这里插入图片描述

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值