Leetcode 第268题Missing Number

题目:Missing Number

  • Given an array containing n distinct numbers taken from 0, 1, 2, …, n, find the one that is missing from the array.

  • For example,
    Given nums = [0, 1, 3] return 2.

    Note:
    Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?


思路:

  • 找出一堆连续数字中缺少的数字
  • 方法一:二分搜索
    • 先将数组排序,然后进行二分查找;如果中点下标与中点的值相同,那么就查找中点的后面;如果中点的下标与中点的值不同,那么就查找中点的前面部分。如果确实的数字是最后一个数字,那么整个数组都没有错位,就返回数组中的最后一个数加一
  • 方法二:异或方法
    • 异或的特点是如果0与a异或那么结果是a;如果a与a异或那么结果是0
    • 所以把数组中的所有数字相异或;再将正确的数字排序异或;最后的结果就是缺失的数字
  • 方法三:数列求和法
    • 因为数组中的数字是等差为1的数列,那么将给的数组的每个数字相加;
    • 把数组中的长度加一到0求和;
    • 两个和的差值就是缺失的数字

代码:

  • C++:
    方法二代码:
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int l=nums.size();
        int res=nums[0];
        for(int i=1;i<l;i++)
        {
            res=res^nums[i];
        }
        for(int j=0;j<l+1;j++)
        {
            res=res^j;
        }
        return res;
    }
};

方法三代码:

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int l=nums.size();
        int res=nums[0];
        int temp=0;
        for(int i=1;i<l;i++)
        {
            res=res+nums[i];
        }
        for(int j=0;j<l+1;j++)
        {
            temp=temp+j;
        }
        return temp-res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值