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

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.xdnf.cn/news/16728.html

相关文章:

  • 数学建模——非线性规划
  • 大文档免费翻译方法分享
  • 政策合规性前端设计:工业数据安全的可视化技术规范与落地实践
  • C语言进阶(指针2.函数指针和指针函数,二级指针,指针数组和数组指针,void*指针)
  • 数据结构 排序(2)---选择排序
  • 使用鼠标在Canvas上绘制矩形
  • PDF转Word免费工具!批量处理PDF压缩,合并, OCR识别, 去水印, 签名等全功能详解
  • Shader开发(四)计算机图形学中的颜色定义
  • Java 大视界 -- Java 大数据机器学习模型在金融信用评级模型优化与信用风险动态管理中的应用(371)
  • Day23-二叉树的层序遍历(广度优先搜素)
  • [明道云]-基础教学2-工作表字段 vs 控件:选哪种?
  • Redis 跨主机连接超时分析:从网络波动到架构优化
  • 个人健康管理小程序(消息订阅、Echarts图形化分析)
  • TGD第八篇:二维应用——图像边缘检测
  • ftp加ssl,升级ftps
  • 三维扫描相机:工业自动化的智慧之眼——迁移科技赋能智能制造新纪元
  • 从东南亚出发:小程序容器技术如何助力 App 快速打入全球市场?
  • LeetCode 1616.分割两个字符串得到回文串
  • PHP性能优化与高并发处理:从基础到高级实践
  • 直播间里的酒旅新故事:内容正在重构消费链路
  • 设计模式:状态模式 State
  • 配置daemon.json使得 Docker 容器能够使用服务器GPU【验证成功】
  • 设计模式十三:代理模式(Proxy Pattern)
  • mac 字体遍历demo
  • 网络原理 - TCP/IP(一)
  • 大数据集分页优化:LIMIT OFFSET的替代方案
  • 解密数据结构之二叉树
  • 解锁全球数据:Bright Data MCP 智能解决代理访问难题
  • 84、【OS】【Nuttx】【启动】栈溢出保护:asm 关键字(下)
  • 使用jQuery时的注意事项