• 缺失的第一个正数


    题目

    给你一个未排序的整数数组 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;
        }
    
  • 相关阅读:
    java环境变量配置
    线性表基本操作(没实现)
    请求路径问题(视频学习)
    SpringMVC_关于<url-pattern>
    SpringMVC_第一个程序
    Spring与Web
    Spring与MyBatis整合上_Mapper动态代理方式
    Spring_Spring与DAO_Spring的事务管理
    Spring_Spring与DAO_Spring的Jdbc模板
    Spring_Spring与AOP_AspectJ基于XML的实现
  • 原文地址:https://www.cnblogs.com/huacha/p/16865611.html
Copyright © 2020-2023  润新知