第一周 LeetCode41 First Missing Positive

2024-04-14 02:58

本文主要是介绍第一周 LeetCode41 First Missing Positive,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

First Missing Positive

LeetCode上的41题:https://leetcode-cn.com/problems/first-missing-positive/description/

  • First Missing Positive
    • 题目
    • 题解
    • 代码

题目

Given an unsorted integer array, find the smallest missing positive integer.

Example 1:

Input: [1,2,0]
Output: 3

Example 2:

Input: [3,4,-1,1]
Output: 2

Example 3:

Input: [7,8,9,11,12]
Output: 1

Your algorithm should run in O(n) time and uses constant extra space.

题解

设数组长度为n,容易看出要找的最小的缺失正整数必然在1到n+1之间,如果数组的所有数在1到n之间,那么缺失的第一个正数为n+1,否则缺失的第一个正数在1到n之间。
如果不考虑空间的话可以使用一个大小为n的数组,然后遍历原数组,若元素值在1到n之间,则在数组对应该元素值的地方(元素值减一)做记录。最后遍历新的数组,找到第一个没有做记号的位置,返回下标加一。若没有找到说明原数组的元素值都在1到n之间,那么答案为n+1

但是题目要求使用常数空间,故不能使用新的数组,而是要在原数组上进行修改。方法和上面基本一样,当扫描到元素值在1到n之间的数,若其位置不对则将其放在对应位置上。在第二个例子,遍历到3时将3和位置2的数交换,得到[-1, 4, 3, 1],当元素值不在1到n之间,或是该元素位置正确则继续遍历。

此时需要处理一种特殊情况,如数组[2, 2],当遍历第一个2时将其与位置1的数交换,但交换的也是2,导致死循环,因此交换时需要测试交换的两个数是否相等。这个条件如果成立,说明该元素对应的位置已经放置了正确的数,不用交换继续遍历。

代码

class Solution {
public:int firstMissingPositive(vector<int>& nums) {int k = 0, _size = nums.size();while (k < _size) {if (nums[k] > 0 && nums[k] < _size + 1 && nums[k] != nums[nums[k] - 1]) {swap(nums[k], nums[nums[k] - 1]);}else {k++;}}int j = 0;for (; j < _size; j++) {if (nums[j] != j + 1)return j + 1;}return j + 1;}
};

这篇关于第一周 LeetCode41 First Missing Positive的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901910

相关文章

code: 400, msg: Required request body is missing 错误解决

引起这个错误的原因是,请求参数按照get方式给。 应该给json字符串才对 补充: 1. @RequestBody String resource 加@RequestBody必须给json字符串,否则会报错400,记如标题错误。 不加这个的进行请求的话,其实post和get就没有什么区别了。 2. List<String> indexCodes=(List<String>)json.

广度优先搜索Breadth-First-Search

目录  1.问题 2.算法 3.代码 4.参考文献  1.问题         广度优先搜索,稍微学过算法的人都知道,网上也一大堆资料,这里就不做过多介绍了。直接看问题,还是从下图招到一条从城市Arad到Bucharest的路径。  该图是连通图,所以必然存在一条路径,只是如何找到最短路径。 2.算法 还是贴一个算法的伪代码吧: 1 procedu

Vue3+Vite+Echarts 出现Missing semicolon错误

使用的echarts代码如下:   import * as echarts from 'echarts';type EChartsOption = echarts.EChartsOption;var chartDom = document.getElementById('main')!;var myChart = echarts.init(chartDom);var option: ECha

LeetCode - 41. First Missing Positive

41. First Missing Positive  Problem's Link  ---------------------------------------------------------------------------- Mean:  给你一组整数,找出第一个空缺的正整数. 要求:时间O(n),空间O(n). analyse: 这题时间O(n)想了

如何使用 ef core 的 code first(fluent api)模式实现自定义类型转换器?

如何使用 ef core 的 code first 模式实现自定义类型转换器 前言 1. 项目结构2. 实现步骤2.1 定义转换器2.1.1 DateTime 转换器2.1.2 JsonDocument 转换器 2.2 创建实体类并配置数据结构类型2.3 定义 Utility 工具类2.4 配置 DbContext2.4.1 使用 EF Core 配置 DbContext 的两种实现方式2.

GIS算法基础丨第一周作业

问题1:最佳工作序列 有N件工作,输入每件工作的费时、最后完成的期限以及工作的价值,试求可能的一个完成工作序列,使得价值和最大。 /** GIS算法第一周作业 luo* * 程序功能:有N件工作,输入每件工作的费时、最后完成期限以及工作的价值,* 试求可能的一个完成工作序列,使价值之和最大。* * luo 2024/9/2 最佳工作序列* 存在问题:代码样例限制了每件工作费时1天

Missing Pages

题目描述 Long ago, there were periodicals called newspapers, and these newspapers were printed on paper, and people used to read them, and perhaps even share them. One unfortunate thing about this for

Missing Purpose String in Info.plist File:构建版本按钮不显示.

最近做了一个新项目,打包发布的时候,等了好长时间,构建版本的按钮就是不出现,后来登录开发者账号的邮箱,才看见苹果发过来的邮件: Dear Developer, We identified one or more issues with a recent delivery for your app, "蓝汇智能AI". Please correct the following issues, t

C++ std::multiset返回值 has no member named ‘first’

error: ‘std::multiset<>::iterator {aka struct std::_Rb_tree_const_iterator<>}’ has no member named ‘first’   multiset返回的直接是迭代器,所以没有first // INTEGER EXAMPLE // CPP program to illustrate // Implem

《Head First设计模式》之命令模式

命令模式就是将方法调用(Method invocation)封装起来。通过封装方法调用,我们可以把运算块包装成形,所以调用此运算的对象不需要关心事情是如何进行的,只要知道如何使用包装成形的方法来完成它就可以了。通过封装方法调用,可以用在以下场景:记录日志或者重复使用这些封装来实现撤销(undo)。     我对于命令模式的理解是:当我需要做一件事的时候,我只需要给出一个命令,这个命令中的