• 【剑指Offer】面试题53


    题目

    一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

    示例 1:

    输入: [0,1,3]
    输出: 2
    

    示例 2:

    输入: [0,1,2,3,4,5,6,7,9]
    输出: 8
    

    限制:1 <= 数组长度 <= 10000

    思路一:暴力

    从头开始查找,如果下标和当前位置数不等,则返回下标,最后返回数组大小。

    代码

    时间复杂度:O(n)
    空间复杂度:O(1)

    class Solution {
    public:
        int missingNumber(vector<int>& nums) {
            int size = nums.size();
            for (int i = 0; i < size; ++i) {
                if (nums[i] != i) return i;
            }
            return size;
        }
    };
    

    思路二:二分

    代码

    时间复杂度:O(logn)
    空间复杂度:O(1)

    class Solution {
    public:
        int missingNumber(vector<int>& nums) {
            int size = nums.size(), i = 0, j = size - 1;
            while (i < j) {
                int mid = i + (j - i) / 2;
                if (nums[mid] == mid) i = mid + 1;
                else if (nums[mid] > mid) j = mid;
            }
            if (j != nums[j]) return j; //第一个数不等
            return nums[j] == size ? size - 1 : size; //最后一个数不等
        }
    };
    

    简化

    class Solution {
    public:
        int missingNumber(vector<int>& nums) {
            int size = nums.size(), i = 0, j = size - 1;
            while (i <= j) {
                int mid = i + (j - i) / 2;
                if (nums[mid] == mid) i = mid + 1;
                else j = mid - 1;
            }
            return i;
        }
    };
    
  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12676565.html
Copyright © 2020-2023  润新知