棋子

导航

First Missing Positive && missing number

https://leetcode.com/problems/first-missing-positive/

我原以为数组中不会有重复的数字,所以利用min、max分别记录给定数组中出现的最小正整数和最大正整数{可以求出这之间的所有数值之和sum2=(min+max)*(max-min+1)/2},并且遍历给定数组,将所有正整数求和计入sum1。如果sum1>sum2则,sum1-sum2为中断数字,否则说明【min,max】连续,max+1即为所求。接着处理一些边界条件接好。但,太天真了(不过这种思路对于不含重复元素的数组仍然还是不错的思路),看看这种思路的代码实现:

class Solution {
public:
    Solution():res(1){
    }
    int firstMissingPositive(vector<int>& nums) {
        if(nums.size()==0)
            return res;
        int min=0,max=0;
        int sum=0;
        for(int i=0;i<nums.size();i++)
            if(nums[i]>0){
                min=max=nums[i];
                break;
            }
        for(int i=0;i<nums.size();i++){
            if(nums[i]>0){
                if(nums[i]<min)
                    min=nums[i];
                if(nums[i]>max)
                    max=nums[i];
                sum+=nums[i];
            }
        }
        res=(max-min+1)*(min+max)/2-sum;
        if(res==0)//说明数字连续,没有中断,缺失最后一个未出来的正整数
            res=max+1;
        if(min!=1)
            res=1;
        return res;
    }
private:
    int res;
};
View Code

依旧看看大神的想法:

http://www.cnblogs.com/AnnieKim/archive/2013/04/21/3034631.html

 只要数组中有1这个元素,那么就会挤走数组中的第一个元素!如果有重复元素的话?(只会交换一次,后面的进行判定并忽略)

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int i=0;
        while(i<nums.size()){
            if(nums[i]!=i+1 && nums[nums[i]-1]!=nums[i] && nums[i]>=1 && nums[i]<=nums.size())
                swap(nums[i],nums[nums[i]-1]);
            else
                i++;
        }
        for(int i=0;i<nums.size();i++)
            if(nums[i]!=i+1)
                return i+1;
        return nums.size()+1;
    }

};

------------------------------------------------分界线-------------------------------------另一道题--------------------------------------------------

 https://leetcode.com/problems/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.

自己最初的思路完全可以应用到这道题中来(3月11下午13:04  新增)

class Solution {
public:
    Solution():res(1){
    }
        int missingNumber(vector<int>& nums) {  
        if(nums.size()==0)
            return res;
        int min=0,max=0;
        int sum=0;
        for(int i=0;i<nums.size();i++)
            if(nums[i]>=0){
                min=max=nums[i];
                break;
            }
        for(int i=0;i<nums.size();i++){
            if(nums[i]>=0){
                if(nums[i]<min)
                    min=nums[i];
                if(nums[i]>max)
                    max=nums[i];
                sum+=nums[i];
            }
        }
        res=(max-min+1)*(min+max)/2-sum;
        if(res==0)//说明数字连续,没有中断,缺失最后一个未出来的正整数
            res=max+1;
        if(min!=0)
            res=0;
        return res;
    }
private:
    int res;
};

 

posted on 2016-03-11 11:23  鼬与轮回  阅读(328)  评论(0编辑  收藏  举报