日常刷题09

题目:给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
示例 1:
输入: [3,0,1]
输出: 2
示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
(来源:力扣(LeetCode))
思路:第一眼看到这个题目的时候想到的肯定是先对给定的数据进行排序,然后依次检查,返回缺失的那个数字。那,能不能用另一种方法代替排序算法(毕竟排序算法比较麻烦),来实现题目要求实现的功能?肯定是有的。大致的思路是:另设一个数组,将这个数组的下标与题目给定的数组中的数联系起来,比如a[0]=0,a[1]=1……将a[没有出现的数字]这个元素置-1,比如,输入的是3,0,1,2没有出现,那么,a[2]=-1,最后,只要返回数组中元素为-1的元素的下标,就是原来数列中缺少的元素。
代码:

int missingNumber(int* nums, int numsSize)
{
    int *a,i;
    a=(int*)malloc((numsSize+1)*sizeof(int));
    /*举个例子,当输入的numsSize为5时,因为它缺少一个
    数,所以新开辟的存储空间需要在原来的numsSize的基础上
    加1*/
    for(i=0;i<numsSize;i++)
    	a[i]=-1;
    for(i=0;i<numsSize;i++)
        a[nums[i]]=nums[i];
    for(i=0;i<numsSize;i++)
    {
        if(a[i]==-1)
        break;
    }
    return i;
}

这其实应该是哈希表的思想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值