First Missing Positive

来源:互联网 发布:淘宝店铺活动怎么参加 编辑:程序博客网 时间:2024/06/01 08:13

First Missing Positive

Total Accepted: 5538 Total Submissions: 25376

Given an unsorted integer array, find the first missing positive integer.

For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.

Your algorithm should run in O(n) time and uses constant space.


分析:

很直接的一个思路是:使用数组vis标记A中正数值的出现(vis[A[i]]=ture,A[i]>0),在A中没有出现的最小正数就是答案。但是题目对空间的要求使得根据A的大小动态建立vis变为不可能,因此只能利用已有的空间:数组A。A既是传入数据,也用作标记数组。选定标志flag,当A[i]>0 && A[i] - 1 >= 0 && A[i] - 1 < A.length时,用临时变量x先保存A[A[i]-1],再令A[A[i]-1]=flag,从而实现对A[i]做标记。对于x,执行相同的操作,直至x不满足x>0 && x - 1 >= 0 && x - 1 < A.length


Java Code:

public int firstMissingPositive(int[] A) {int i;final int flag = -1;  //选定-1为标志for (i = 0; i < A.length; ++i) {  //如果A中有flag,要先清除if (A[i] == flag) {A[i] = 0;}}//下面的for-loop负责扫描并标记正数for (i = 0; i < A.length; ++i) {int x = A[i], y = x;while (0 <= y - 1 && y - 1 < A.length && A[y - 1] != flag) {x = A[y - 1];A[y - 1] = flag;y = x;}}//下面的for-loop负责找出未出现的最小正数for (i = 0; i < A.length; ++i) {if (A[i] != flag) {break;}}return i + 1;    }


0 0
原创粉丝点击