首页 > 其他分享 >缺失的第一个正数

缺失的第一个正数

时间:2022-11-07 13:36:23浏览次数:70  
标签:正整数 第一个 nums int 示例 public 数组 正数 缺失

题目

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

输入:nums = [1,2,0]
输出:3
示例 2:

输入:nums = [3,4,-1,1]
输出:2
示例 3:

输入:nums = [7,8,9,11,12]
输出:1

提示:

1 <= nums.length <= 5 * 105
-231 <= nums[i] <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/first-missing-positive
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:排序,遍历

  • 解题思路:
    注:时间复杂度不符合题目要求
    先排序,从大到小判断是否有最小没出现的正整数
public int firstMissingPositive(int[] nums) {
        int rs=1;
        Arrays.sort(nums);
        for(int i=0;i<nums.length;i++)
        {
            if(nums[i]==rs)
            {
                rs++;
            }
        }
        return rs;
    }

解法二:布尔数组

  • 解题思路
    注:需要new一个n+1的布尔数组,不符合只使用常数级别额外空间
		public int firstMissingPositive2(int[] nums) {
        int rs=1;
        boolean[] booleans=new boolean[nums.length+1];
        for(int i=0;i<nums.length;i++)
        {
            if(nums[i]>0 && nums[i]<=nums.length)
            {
                booleans[nums[i]]=true;
            }
        }
        for (int i = 1; i < booleans.length; i++) {
            if(!booleans[i])
            {
                break;
            }
            rs++;
        }
        return rs;
    }

解法三:哈希法

  • 解题思路
    把数组当做哈希表,首先处理数组中所有的负数和0的数据,设置为n+1;然后将数组中小于n的数,绝对值取反,注意要设置在num-1位置上。注意nums[i]=0这种情况已经在上一个循环里面处理完了。然后再循环一遍,判断nums[i]>0,说明这个位置出现了断点。这里就是最小正整数了。
public static int firstMissingPositive3(int[] nums) {
        int n = nums.length;
        // 处理负数和0
        for (int i = 0; i < n; i++) {
           if(nums[i]<=0)
           {
               nums[i]=n+1;
           }
        }
        for (int i = 0; i < n; i++) {
            int num = Math.abs(nums[i]);
            if(num<=n)
            {
                //本身取反,但需要设置在num-1那个位置上,因为处理了
                nums[num-1]=-Math.abs(nums[num-1]);
            }
        }
        for (int i = 0; i < n; i++) {
            if(nums[i]>0)
            {
                return i+1;
            }
        }
        return n+1;
    }

标签:正整数,第一个,nums,int,示例,public,数组,正数,缺失
From: https://www.cnblogs.com/huacha/p/16865611.html

相关文章

  • pandas df分段(cut)后交叉(crosstab)数据标签缺失的补充
    数值数据分类后交叉,但是数据量少,或者划分标准不科学导致分类的类别有缺失,交叉后会丧失类别,数据不齐整importnumpyasnpimportpandasaspddf=pd.DataFrame(n......
  • 2.第一个宏代码
    #//在本工作簿路径下新增工作簿并输入数据//在本工作簿路径下新增工作簿并输入数据functiontest()//声明函数,函数名字为text{......
  • 003.完成第一个接口的开发
    1.开发firstrequest接口/***描述:演示接口和传参*//@RestController表示返回时JSON格式不是页面*/@RestControllerpublicclassParaController{@G......
  • JDBC介绍及第一个JDBC程序测试
    一、JDBC介绍SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC。这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jd......
  • 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母
    分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。法一:letter=input("请输入:")ifletter=='S':print('请输入第二个字符:')let......
  • 278.第一个错误的版本
    你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是......
  • 如何从 Java 的 List 中删除第一个元素 remove
    如何从Java的List中删除第一个元素remove概述在这个实例中,我们将会演示如何删除在Java中定义的List的第1个元素。我们将会针对这个问题使用List接口的......
  • 3第一个MVC程序
    3第一个MVC程序1.配置板1、新建一个Moudle,springmvc-02-hello,添加web的支持!2、确定导入了SpringMVC的依赖!3、配置web.xml,注册DispatcherServlet<?xmlversion=......
  • 28.找出字符串中第一个匹配项的下标
    给你两个字符串 haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果 needle不是haystack的一部分,则返回 -1......
  • 387.字符串中的第一个唯一字符
    给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。 示例1:输入:s="leetcode"输出:0示例2:输入:s="loveleetcode"......