给定一个未排序数组,找到缺失的最小整数

若不考虑时间复杂度,空间复杂度的话
思路很简单,定义一个res=1,遍历数组如果找到与res相等就res++,跳出循环,再从头开始遍历,如果找到继续res++,直到数组中所有元素都能与res对应相等,或者遍历完也没找到res相应相等的元素就返回res

class Solution {
    public int firstMissingPositive(int[] nums) {
        int res = 1;
        for (int j = 0; j < nums.length; j++) {
            for (int i = 0; i < nums.length; i++) {
                if (res == nums[i]){
                    res++;
                    break;
                }
            }
        }
        return res;
    }
}

时间复杂度时O(n2),显然上述方法不太实用。
在这里插入图片描述
在这里插入图片描述

class Solution {
			int len = nums.length;
	        //把所给数组当成一个hash表,将元素一一对应放到数组里面(1放在下标为0的位置,2放在下标为1的位置,3放在下标为2的位置上,4放在下标为3的位置)
	        for (int i = 0; i < len; i++){
	            while (nums[i] >= 1 && nums[i] <= nums.length && nums[nums[i] - 1] != nums[i]){//当nums[i]恰好等于nums[i]-1位置上的值时就不用交换了,所以nums[nums[i] - 1] != nums[i]
	                swap(nums, i, nums[i] - 1);//交换位置,(1放在0,2放在1,3放在2位置上),将元素i放在nums[i]-1位置上
	            }
	        }
	        //遍历数组,如果nums[i] != i+1,就返回i+1,遍历完都符合要求就返回nums.length+1
	        for (int i = 0; i < nums.length; i++) {
	            if (nums[i] != i+1){//i位置需要匹配一个i+1,此时i位置上不是i+1
	                return i+1;
	            }
	        }
	        return nums.length + 1;
	    }
	    
//自定义交换函数
	    private void swap(int[] nums, int index1, int index2){
	        int temp = nums[index1];
	        nums[index1] = nums[index2];
	        nums[index2] = temp;
	    }
}

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值