leetcode41 --- firstMissingPositive
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相关推荐
- 缺失的第一个正数—leetcode41
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9, ...
- 《leetcode》first-missing-positive
题目描述 Given an unsorted integer array, find the first missing positive integer. For example, Given[1, ...
- leetcode41 缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...
- Leetcode--41. 缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...
- LeetCode--41.缺失的第一个正数(C)
缺失的第一个正数(C) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 申请额外空间实现 3.2 原数组实现 1. 题目描述 难度:困难 2. 题目分析 这道题本质上是很简单的,但是加上了这 ...
- Leetcode每日一题:41.first-missing-positive(缺失的第一个正数)
int firstMissingPositive(vector<int> &nums) {//遍历一次数组把大于等于1的和小于数组大小的值放到原数组对应位置,对于重复的元素,置0: ...
- leetcode41. First Missing Positive
给定一个数组,找出数组中不曾出现的最小正整数. 关键在于需要对原数组进行操作. class Solution:def firstMissingPositive(self, nums):"&q ...
- Leetcode41.First Missing Positive
大意:输出数组中未出现过的最小整数 简单思路: 1.排序,然后找到第一个不符合A[i]=i+1的元素即为正确答案.时间:O(nlgn) 额外空间:O(1) 2.一个哈希记录表,将所有出现过的元素记录为 ...
- [Swift]LeetCode41. 缺失的第一个正数 | First Missing Positive
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
最新文章
- redis的导入导出需要特别注意的地方
- drupal建设多语言站点之四:不同语言的站点名称
- Linux根文件系统的文件镜像,构建小型Linux根文件系统镜像
- 考研初试成绩陆续公布,说说你的考研故事
- 【英语学习】【Daily English】U14 Transportation L04 I'm going to go screen
- 揭秘一家网络推广公司的引流变现套路
- 什么是SQL Server故障转移群集
- APACHE局域网配置域名访问
- android idle模式
- FreeWheel是一家怎样的公司?
- 怎么更新计算机显卡,电脑显卡怎么升级?电脑显卡升级的教程
- 最强大脑-星际迷航-JQuery 版本
- Euclid算法和拓展欧几里得算法
- vb.net 教程 3-4 窗体编程 公共控件6 PictureBox ProgressBar
- 二、关于做地图和如何做成mod
- 海康威视网络摄像头购买指南(焦距像素等参数)
- Qt QNetworkAccessManager 下载url
- unity打开除主菜单其他地方黑屏或白屏与unityHub安装unity简介
- JS如何区分对象和数组
- 华大半导体HC32F4A0系列ARM芯片EXMC并口通信时序的FPGA实现
热门文章
- nmap地址段下的ip_安服福音——花式nmap扫描整理结果(文末重磅消息)
- 吴恩达《机器学习》学习笔记十——神经网络相关(2)
- MFC对话框绘制灰度直方图
- 输入一个十进制数,转化为二进制
- SIFT算法中概念简单解释
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨好友申请 I :总体通过率【难度简单】
- Tomcat学习笔记(一)
- linux nslookup命令安装,在CentOS中安装nslookup命令
- mysql插入实现存在更新_mysql 记录不存在时插入 记录存在则更新的实现方法
- 天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享