First Missing Positive

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值