41.缺失的第一个正数

1.题目

在这里插入图片描述

2.解法

class Solution {    
public int firstMissingPositive(int[] nums) {        
	int len = nums.length;        
	// 先提前确定是否有1        
	int count = 0;        
	for (int i = 0 ; i < len ; i++) {            
	// 先排除里面原本的1                     
		if (nums[i] == 1) {                
		count++;                
		break;            
	}}        
	if (count == 0)             
		return 1;        
	if (nums.length == 1)                 
		return 2;
	// 将负数、0还有大于n的数设置为1        
	for (int i = 0 ; i < len ; i++) {            
		if (nums[i] <= 0 || nums[i] > len) {                
		nums[i] = 1;}}                
	for (int i = 0 ; i < len ; i++) {            
		int a = Math.abs(nums[i]);            
		// 当等于n时,没办法存储,所以放入0            
		if (a == len) {                
		nums[0] = -Math.abs(nums[0]);            
		} else {                
		nums[a] = -Math.abs(nums[a]);}}
	// 先判断前面是否连续        
	for (int i = 1 ; i < len ; i++) {            
		if (nums[i] > 0)                 
		return i;        }
		if (nums[0] > 0) {            
		return len;}        
		return len+1;}
	}
	```
==时间复杂度为O(n),空间复杂度为O(1)==
## 3.思考
@1、寻找缺失的第一个正数,如果有n个数,如果都连续从12345开始,那么最大为n+1,其余<n+1

@2:将负数,<0的数标为正数1,第一是标为正数,后面以>0好判断,如果标为负数,数组中既有正又有负,
如果nums[a], a为Math.abs(nums[i]),它存在我就标为负数,那么负数就会被标为正,标为正,就证明不存在,

如果全部转换为负数,将问题弄复杂了。之所以将负数和0还有大于n的数标为1,就是不想影响其他正数的判断,提前判断1存不存在好判断,但是其他数字不好判断。
@3:以索引做下标,下标存在,该值存在。应该先判断i=1的值是否连续,再判断n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值