zoukankan      html  css  js  c++  java
  • 代码题(40)— 缺失的第一个正数、缺失数字

    1、41. 缺失的第一个正数

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

    示例 1:

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

    示例 2:

    输入: [3,4,-1,1]
    输出: 2
    

    示例 3:

    输入: [7,8,9,11,12]
    输出: 1

    思路:交换数组元素。使得数组中第i位存放数值(i+1)。

    最后遍历数组,寻找第一个不符合此要求的元素,返回其下标。整个过程须要遍历两次数组,复杂度为O(n)。

    下图以题目中给出的第二个样例为例,解说操作过程。

    class Solution {
    public:
        int firstMissingPositive(vector<int>& nums) {
            if(nums.empty())
                return 1;
            int n = nums.size();
    
            for(int i=0;i<n;++i)
            {
                if(nums[i] <= 0)
                    continue;
                //思路:交换数组元素。使得数组中第i位存放数值(i+1)。
                //假设交换的数据还是大于0且<i+1,且数据不相等,则放在合适的位置,避免死循环
                while(nums[i]>0 && nums[i]<=i+1 && nums[i] != nums[nums[i]-1])
                    swap(nums[i], nums[nums[i]-1]);
            }
            for(int i=0;i<n;++i)
            {
                if(nums[i] != i+1)
                   return (i+1);
            }
            return n+1;
        }
    };

    2、268. 缺失数字

    给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

    示例 1:

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

    示例 2:

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

      这道题还可以用二分查找法来做,我们首先要对数组排序,然后我们用二分查找法算出中间元素的下标,然后用元素值和下标值之间做对比,如果元素值大于下标值,则说明缺失的数字在左边,此时将right赋为mid,反之则将left赋为mid+1。那么看到这里,作为读者的你可能会提出,排序的时间复杂度都不止O(n),何必要多此一举用二分查找,还不如用上面两种方法呢。对,你说的没错,但是在面试的时候,有可能人家给你的数组就是排好序的,那么此时用二分查找法肯定要优于上面两种方法。

    class Solution {
    public:
        int missingNumber(vector<int>& nums) {
            if(nums.empty())
                return -1;
            int n = nums.size();
            sort(nums.begin(),nums.end());
            
            int left = 0,right = n;
            while(left<right)
            {
                int mid = (left+right)/2;
                if(nums[mid] == mid)
                    left = mid+1;
                else 
                    right = mid;
            }
            return right;
        }
    };
  • 相关阅读:
    SuperMap房产测绘成果管理平台
    SuperMap产权登记管理平台
    Android adb shell am 的用法(1)
    由浅入深谈Perl中的排序
    Android 内存监测和分析工具
    Android 网络通信
    adb server is out of date. killing...
    引导页使用ViewPager遇到OutofMemoryError的解决方案
    adb logcat 详解
    How to send mail by java mail in Android uiautomator testing?
  • 原文地址:https://www.cnblogs.com/eilearn/p/9435757.html
Copyright © 2011-2022 走看看