当前位置: 首页 > news >正文

Leetcode——41. 缺失的第一个正数

这题是双指针不假,不过其更多的有快排的影子。

对于长度为 n 的数组,缺失的第一个正整数的范围为 [1, n + 1] ,因为,如果是数组是从1开始的严格递增数组,则答案为 n + 1 。

根据如上思考和题意,我们可以将每个数字放在一种对应的下标处,例如1放在0处、2放在1处。这样当我们整理好数组后,循环遍历,只需要 nums[i] != i + 1 时返回 i + 1即可。

现在问题是如何处理数组。考虑到答案在 [1, n + 1] 区间内,我们可以设置两个变量 l, r

l 指向数组最左侧,r 指向数组溢出位置。有如下讨论:

①如果 nums[l] > r,则 swap(l, --r)        // 这样可以将无效数据放在数组末尾

②如果 nums[l] <= l, 则 swap(l, --r)

③如果 nums[l] == l + 1,则 l++

④如果 l + 1 < nums[l] <= r

        Ⅰ如果 nums[nums[l] - 1] == nums[l], 则对应位置数字已存在,最为无效数据处理

                swap(l, --r)

        Ⅱ如果 nums[nums[l] - 1] != nums[l],则对应位置数字未存在,放在指定位置

                swap(l, nums[l] - 1)

根据以上讨论完成代码即可。

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

本题的交换思想在很多地方都会用到,尤其是快排,并且这里将数字与数组下标对应起来也是一种哈希表的思想。

补:最后遍历数组实际上是多余的,由于双指针的策略,最终 l 所指位置应填的数是注重找不到的,所以返回 l + 1 即可。

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

http://www.dtcms.com/a/304351.html

相关文章:

  • 前端学习日记(十五)
  • 深入理解图像插值:从原理到应用
  • 答题抽奖活动小程序技术复盘
  • unittest错误重跑与测试用例跳过机制
  • 操作系统-lecture2(操作系统结构)
  • Unity的GameObject.Instantiate的使用
  • 津发科技带你了解皮肤电信号中的SCL与SCR
  • SuperClaude Framework 使用指南
  • Ubuntu20.04子系统
  • RPG增容2.尝试使用MMC根据游戏难度自定义更改怪物的属性(二)
  • 基于STM32的PD抓包器
  • Vue3 状态管理新选择:Pinia 从入门到实战
  • Item24:若所有参数皆需类型转换,请为此采用non-member函数
  • [leetcode] 组合总和
  • 《林景媚与数据库神谕》
  • 【C++算法】82.BFS解决FloodFill算法_被围绕的区域
  • 驱动(platform)
  • 青少年软件编程图形化Scratch等级考试试卷(三级)2025年6月
  • CentOS Nginx 1.13.9 部署文档
  • Elasticsearch索引设计与性能优化实战指南
  • 使用Y modem协议进行瑞萨RX MCU OTA数据传输
  • vim的`:q!` 与 `ZQ` 笔记250729
  • 数据结构之时间复杂度
  • 【绘制图像轮廓】——图像预处理(OpenCV)
  • 互联网医院系统包含哪些优势?
  • taro+react重新给userInfo赋值后,获取的用户信息还是老用户信息
  • 搭建一个自定义的 React 图标库
  • 设计模式---单例
  • 测试用例的编写:让测试用例的编写条理起来
  • Redis学习09-AOF-混合持久化