从零学算法41

03-08 阅读 0评论

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

从零学算法41,从零学算法41,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,解决方案,第1张
(图片来源网络,侵删)

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

示例 1:

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

输出:3

示例 2:

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

从零学算法41,从零学算法41,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,解决方案,第2张
(图片来源网络,侵删)

输出: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 即可。
  •   public int firstMissingPositive(int[] nums) {
      	// 排序
          Arrays.sort(nums);
          int i = 0;
          // 从大于 0 处开始遍历,相当于去除了小于等于 0 的部分
          while(i
          	// 相当于去重
              while(i
          int n = nums.length;
          for(int i = 0;i
          	// 首先数在理想数组范围
          	//  其次如果 nums[i] 上面的数如果不是 i+1 就把它换到正确的位置,继续判断换过来的数
          	// 直到 num[i] = i + 1 就结束这一轮循环
              while((nums[i]0 && nums[i] 
                  swap(nums,i,nums[i]-1);
              }
          }
          for(int i = 0;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;
      }
    

免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,人围观)

还没有评论,来说两句吧...

目录[+]