1217-2019-LEETCODE-41-缺失的第一个正数

“脏工作环境 ”的应用。利用到了思想:只要是对结果没有影响的数据在本题就可以替换成1(前提是1存在于数组中)
代码来自:https://leetcode-cn.com/problems/first-missing-positive/solution/que-shi-de-di-yi-ge-zheng-shu-by-leetcode/

//LEETCODE
//找第一个缺失的正整数
public int firstMissingPositive(int[] nums){
	int n = nums.length;
	int contains = 0;
	for(int i = 0;i < n;i++){
		if(nums[i] == 1){
			contains++;
			break;
		}
	}
	//没有1
	if(contains == 0){
		return 1;
	}
	if(n == 1){
		return 0;
	}
	//找出所有的小于1的数和大于n的数,都置为1。
	//因为要找第一个正整数,所以0和负数对于数组就没有影响,此时数组中也必定有1,所以直接置1就可以。
	for(int i = 0;i < n;i++){
		if(nums[i] < 1 || nums[i] > n){
			nums[i] = 1;
		}
	}
	for(int i = 0;i < n;i++){
		int a = Math.abs(nums[i]);//相当于新nums[]的下标。
		if(i == n){
			nums[0] = - Math.abs(nums[0]);
		}else{
			//存在a就置负号,a就是新数组的下标。
			//下标为负数就是存在当前下标的值,下标为正数就是不存在当前下标的值。
			nums[a] = - Math.abs(nums[a]);
		}
	}
	for(int i = 1;i < n;i++){
		if(nums[i] > 0){
			return i;
		}
	}

	//如果从1开始全是负数,最后nums[0] > 0,那么n就是不存在。
	if(nums[0] > 0){
		return n;	
	}
	//如果全是负数,就是全都是存在的,就是1,2,3,4,5,6,7,8这种,找最小的正整数就是n + 1;
	return n + 1;
}

自己写的是:找到第一个最小的正整数,然后把所有数组里的值放在list值里,开始逐一判断++min在不在list里,如果不在就找到了最小的缺失的正整数。

public int firstMissingPositive(int[] nums) {
        /**
        *@Description 找出第一个丢失的正整数
        *@Param [nums]
        *@Return int
        *@Author pdzz
        *@Date 2019/12/17
        *@Time 9:31
        */
        /*
            输入: [3,4,-1,1]
            输出: 2
         */
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0 && nums[i] < min){
                min = nums[i];
            }
        }
        if (min > 1){
            return 1;
        }

        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            list.add(nums[i]);
        }
        while (true){
            if (!list.contains(++min)){
                break;
            }
        }
        return min;
    }
发布了98 篇原创文章 · 获赞 0 · 访问量 2219

猜你喜欢

转载自blog.csdn.net/weixin_43221993/article/details/103587168