zoukankan      html  css  js  c++  java
  • 面试题53

    题目地址:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/

    题目描述

    一个长度为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

    解题思路

    二分查找:排序数组中的搜索问题,首先想到二分查找方法,通过分析题目,我们可以将数组nums分为两部分,即左子数组nums[i]=i,右子数组nums[i]!=i,而题目所求缺失的数字恰好是右子数组首元素对应的索引值。接下来,就是具体的循环二分查找,我们先求得nums中点值mid,当nums[mid]=mid时,则右子数组的首位元素一定在区间[mid+1,right]之间,此时,执行i=mid+1,否则,左子数组的末尾元素一定在区间[left,mid-1]之中,此时执行j=mid-1。

    非二分查找:我们令数组nums的大小n=nums.size()。如果n没在nums中出现的话,那么对于所有的0<=i<nums.size(),有nums[i]==i,即索引i处放置数字i,此时所求的缺失数字就是n,即nums.size(),如果n出现在nums中(出现在nums的最后一个位置),则在nums最后位置的前面有nums[i]!=i出现,此时i就是缺失的数字。

    程序源码

    二分查找

    class Solution {
    public:
        int missingNumber(vector<int>& nums) {
            if(nums.size() < 1) return 0;
            int left = 0, right = nums.size() - 1;
            while(left <= right)
            {
                int mid = left + (right - left) / 2;
                if(nums[mid] == mid)
                {
                    left = mid + 1;
                }
                else
                {
                    right = mid - 1;
                }
            }
            return left;
        }
    };

    非二分法

    class Solution {
    public:
        int missingNumber(vector<int>& nums) {
            if(nums.size() < 1) return 0;
            int loss_number = nums.size();
            for(int i = 0; i < nums.size(); i++)
            {
                if(nums[i] != i)
                {
                    loss_number = i;
                    break;
                }
            }
            return loss_number;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    oracle中的case when then else end 用法
    oracle中子查询
    oracle中关联查询、分组查询
    oracle中数据字典、数据、序列、索引、视图知识
    Oracle中rownum用法
    自己(转)JAVA中toString方法的作用
    自己(转)String、StringBuffer与StringBuilder之间区别
    JSP九大内置对象和四个作用域
    servlet及xml文件处理流程
    (转载)get和 post方法的不同
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12603042.html
Copyright © 2011-2022 走看看