[LeetCode]268. Missing Number

[LeetCode]268. Missing Number

题目描述

这里写图片描述

思路

因为只有0-n的数在数组中,所以只要对数组每一位指向的数字加标识即可
这里做的标识为取相反数,需要考虑0的情况

代码

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int zeroIndex = -1;
        for (int i = 0; i < nums.size(); ++i) {
            //数组中数字为数组长度时,越界,跳过
            if (abs(nums[i]) == nums.size())
                continue;
            //数组中数字对应为0时,需要额外标识
            else if (nums[abs(nums[i])] == 0)
                zeroIndex = abs(nums[i]);
            //取相反数标识
            else
                nums[abs(nums[i])] = nums[abs(nums[i])] < 0 ? nums[abs(nums[i])] : -nums[abs(nums[i])];
        }
        for (int i = 0; i < nums.size(); ++i) {
            //标识后,对应数字为正数,或者数字为0,零标识未改变的,返回当前数字下标
            if (nums[i] > 0 || (nums[i] == 0 && zeroIndex == -1))
                return i;
        }
        //若数组中数字都小于0,且0标识也被改变,那么缺失的数只有最大的
        return nums.size();
    }
};

int main() {
    vector<int> nums = { 2, 0, 1 };
    Solution s;
    cout << s.missingNumber(nums) << endl;

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值