First Missing Positive
Posted 棋子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了First Missing Positive相关的知识,希望对你有一定的参考价值。
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; };
依旧看看大神的想法:
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; };
以上是关于First Missing Positive的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode 41. First Missing Positive
41. First Missing Positive *HARD*
leetCode题解之First Missing Positive