从零学算法41

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

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

示例 1:

输入:nums = [1,2,0]

输出:3

示例 2:

输入:nums = [3,4,-1,1]

输出:2

示例 3:

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

输出:1

  • 我的想法很简单,当该数组排序并去重后,再去掉小于等于 0 的部分,最终遍历数组时,判断是否为从 1 开始连续的数,比如 [1,2,3] 那就返回最大值 + 1 即 4,若不为从 1 开始的连续的数组,比如 [1,3,4] 中,nums[0] == 1,但是 nums[1] != 2,说明缺失了 2,那就直接返回 2 即可。
java 复制代码
  public int firstMissingPositive(int[] nums) {
  	// 排序
      Arrays.sort(nums);
      int i = 0;
      // 从大于 0 处开始遍历,相当于去除了小于等于 0 的部分
      while(i<nums.length && nums[i]<=0)i++;
      // 从 1 开始往后找看是否为 1,2,3,4...
      int ans = 1;
      while(i<nums.length){
      	// 相当于去重
          while(i<nums.length - 1 && nums[i] == nums[i+1])i++;
          if(nums[i]!=ans)return ans;
          ans++;
          i++;
      }
      return ans;
  }
  • 上面也提到了,我们的理想数组应该为从 1 开始递增的正整数数组,即满足 nums[i] == i+1 ,也可以写作 i == nums[i]-1,所以我们就交换数组元素使得所有能满足的数处于对应的位置。最后从头开始判断是否为理想中的数,不是就直接返回,如果都满足就返回数组长度 + 1
  • 要处理的还有两个细节:1. 排除小于 1 的以及大于数组长度的数;2. 排除重复的数
  • 第一点好判断,主要还是第二点,我们可能会写成如果 nums[i]!=i+1 就交换,那交换哪两个数呢?我们需要两个下标。所以上面说也可以写作 i == nums[i]-1 因为 a==b => nums[a] == nums[b],所以我们判断条件写成 nums[i]==nums[nums[i]-1]
  • 而为什么不写作比如 nums[nums[i]]==nums[i+1] 是因为我们需要判断位置的主体为 nums[i],所以写作 i==xxx 的形式,这样的写法每次交换位置都会把 nums[i] 放到它应该处于的位置,比如 [2,-1,-2] 在第一次遍历会把 nums[0] 也就是 2 换到应该处于的位置,即下标为 1 的位置得到 [-1,2,-2],然后继续判断 nums[0] 是否为我们想要的数...
java 复制代码
  public int firstMissingPositive(int[] nums) {
      int n = nums.length;
      for(int i = 0;i<n;i++){
      	// 首先数在理想数组范围
      	//  其次如果 nums[i] 上面的数如果不是 i+1 就把它换到正确的位置,继续判断换过来的数
      	// 直到 num[i] = i + 1 就结束这一轮循环
          while((nums[i]>0 && nums[i] <= n) && nums[i]!=nums[nums[i]-1]){
              swap(nums,i,nums[i]-1);
          }
      }
      for(int i = 0;i<n;i++){
          if(nums[i]!=i+1)return i+1;
      }
      return n+1;
  }
  public void swap(int[] nums,int i,int j){
      int temp = nums[i];
      nums[i]=nums[j];
      nums[j]=temp;
  }
相关推荐
Ven%11 分钟前
【AI大模型算法工程师面试题解析与技术思考】
人工智能·python·算法
天勤量化大唯粉12 分钟前
枢轴点反转策略在铜期货中的量化应用指南(附天勤量化代码)
ide·python·算法·机器学习·github·开源软件·程序员创富
爱学习的小仙女!27 分钟前
算法效率的度量 时间复杂度 空间复杂度
数据结构·算法
AndrewHZ29 分钟前
【复杂网络分析】什么是图神经网络?
人工智能·深度学习·神经网络·算法·图神经网络·复杂网络
Swizard37 分钟前
拒绝“狗熊掰棒子”!用 EWC (Elastic Weight Consolidation) 彻底终结 AI 的灾难性遗忘
python·算法·ai·训练
Spider赵毅38 分钟前
python实战 | 如何使用海外代理IP抓取Amazon黑五数据
python·tcp/ip·php
月光技术杂谈44 分钟前
基于Python的网络性能分析实践:从Ping原理到自动化监控
网络·python·性能分析·ping·时延·自动化监控
龘龍龙1 小时前
Python基础学习(四)
开发语言·python·学习
洵有兮2 小时前
python第四次作业
开发语言·python
kkoral2 小时前
单机docker部署的redis sentinel,使用python调用redis,报错
redis·python·docker·sentinel