1 题目

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

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

2 解法

最笨的方法是从1开始试, 看1在数组里面是否出现过, 2, 3, ....不过时间复杂度是.

2.1 hash

可以考虑用hash, 遍历数组, 把每个元素的值作为key, 遍历完数组之后再从1开始看是否在hash里面. 但是这样做会额外申请一个hash容器, 这样就不是常数级额外空间了, 而是. 于是考虑利用原数组构造所需hash表. 首先要明确一点, 假设数组的元素个数是n, 会有两种情况, 如果数组正好囊括了所有1 ~ n的所有正整数, 那么不存在的最小正整数就是n + 1, 但凡有一个元素值不在1 ~ n中, 所求结果就在[1, n]中. 可以考虑遍历数组, 如果元素值value在[1, n]中, 那么就在对应nums[value - 1](n个元素下标从0开始, nums[0]代表第一个元素)标记一下, 证明value是出现过的, 这样最后再遍历nums, 发现第一个没有标记上的元素的索引 + 1就是所找的最小正整数. 但是怎么标记呢? 比如元素value在[1, n] 中, 那么就要对nums[value - 1]进行标记, 但是还不能丢失该元素的值信息(比如nums[value - 1]也在[1, n]里面, 你改成n + 2的话就会丢失原有的信息了), 所以考虑到设置成负值. 这样结尾遍历的时候, 小于零的话证明这个位置被别人标记过, 也就是占位的正整数出现过, 那么大于0的值的下标 + 1就是第一个结果. 如果遍历到最后还没有返回值, 那么就是n + 1, 要这么做的话首先要保证所有元素都为正的, 那么就把非正元素设置为n + 1.

代码:

int firstMissingPositive(vector<int>& nums) {int nums_size = nums.size();for (int &num: nums) {if (num <= 0) {num = nums_size + 1;}}for (int i = 0; i < nums_size; i ++) {if (nums[i] <= 0) {nums[i] = nums_size + 1;}}for (int i = 0; i < nums_size; i ++) {int ele_abs = abs(nums[i]);if (ele_abs <= nums_size) {nums[ele_abs - 1] = -abs(nums[ele_abs - 1]);}}for (int i = 0; i < nums_size; i ++) {if (nums[i] > 0)return i + 1;}return nums_size + 1;
}

2.2 置换法

leetcode41 --- firstMissingPositive相关推荐

  1. 缺失的第一个正数—leetcode41

    给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9, ...

  2. 《leetcode》first-missing-positive

    题目描述 Given an unsorted integer array, find the first missing positive integer. For example, Given[1, ...

  3. leetcode41 缺失的第一个正数

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...

  4. Leetcode--41. 缺失的第一个正数

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...

  5. LeetCode--41.缺失的第一个正数(C)

    缺失的第一个正数(C) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 申请额外空间实现 3.2 原数组实现 1. 题目描述 难度:困难 2. 题目分析 这道题本质上是很简单的,但是加上了这 ...

  6. Leetcode每日一题:41.first-missing-positive(缺失的第一个正数)

    int firstMissingPositive(vector<int> &nums) {//遍历一次数组把大于等于1的和小于数组大小的值放到原数组对应位置,对于重复的元素,置0: ...

  7. leetcode41. First Missing Positive

    给定一个数组,找出数组中不曾出现的最小正整数. 关键在于需要对原数组进行操作. class Solution:def firstMissingPositive(self, nums):"&q ...

  8. Leetcode41.First Missing Positive

    大意:输出数组中未出现过的最小整数 简单思路: 1.排序,然后找到第一个不符合A[i]=i+1的元素即为正确答案.时间:O(nlgn) 额外空间:O(1) 2.一个哈希记录表,将所有出现过的元素记录为 ...

  9. [Swift]LeetCode41. 缺失的第一个正数 | First Missing Positive

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

最新文章

  1. redis的导入导出需要特别注意的地方
  2. drupal建设多语言站点之四:不同语言的站点名称
  3. Linux根文件系统的文件镜像,构建小型Linux根文件系统镜像
  4. 考研初试成绩陆续公布,说说你的考研故事
  5. 【英语学习】【Daily English】U14 Transportation L04 I'm going to go screen
  6. 揭秘一家网络推广公司的引流变现套路
  7. 什么是SQL Server故障转移群集
  8. APACHE局域网配置域名访问
  9. android idle模式
  10. FreeWheel是一家怎样的公司?
  11. 怎么更新计算机显卡,电脑显卡怎么升级?电脑显卡升级的教程
  12. 最强大脑-星际迷航-JQuery 版本
  13. Euclid算法和拓展欧几里得算法
  14. vb.net 教程 3-4 窗体编程 公共控件6 PictureBox ProgressBar
  15. 二、关于做地图和如何做成mod
  16. 海康威视网络摄像头购买指南(焦距像素等参数)
  17. Qt QNetworkAccessManager 下载url
  18. unity打开除主菜单其他地方黑屏或白屏与unityHub安装unity简介
  19. JS如何区分对象和数组
  20. 华大半导体HC32F4A0系列ARM芯片EXMC并口通信时序的FPGA实现

热门文章

  1. nmap地址段下的ip_安服福音——花式nmap扫描整理结果(文末重磅消息)
  2. 吴恩达《机器学习》学习笔记十——神经网络相关(2)
  3. MFC对话框绘制灰度直方图
  4. 输入一个十进制数,转化为二进制
  5. SIFT算法中概念简单解释
  6. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨好友申请 I :总体通过率【难度简单】
  7. Tomcat学习笔记(一)
  8. linux nslookup命令安装,在CentOS中安装nslookup命令
  9. mysql插入实现存在更新_mysql 记录不存在时插入 记录存在则更新的实现方法
  10. 天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享