力扣hot100(17) 缺失的第一个正数

**破题的核心性质:**对于长度为n的数组,缺失的最小整数,一定在1,n+1这个区间里。

原因:最好情况:数组里刚好包含了所有的正整数,那缺失的最小正整数一定是n+1;

其他情况,只要1-n里有任意一个数没出现,那缺失的最小正整数那一定就是这个没出现的数。

置换法:

核心思想:既然答案在1--n里,我们把每个在1,n范围内的数字,放到它本应该在的位置上。比如,数字x本该在的位置是数组下标x-1。等所有的数字都归位,我们只需要遍历一遍数组:第一个下标i里的数不等于i+1的位置,那么i+1就是缺失的最小正整数。如果所有的位置都完全匹配,说明1--n都有,答案就是n+1;

cpp 复制代码
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        //首先进行排序 放到和下角标对应的位置 1放到0

        int n = nums.size();
        for(int i = 0;i<n;++i){

            //数组的该数大于0 且 该数大小不超过n 且 (该数-1)这个下角标对应的数 不等于该数
            //在0-n范围内的才操作 否则就跳过
            while(nums[i]>0&& nums[i]<=n && nums[nums[i]-1]!=nums[i]){

                swap(nums[nums[i]-1], nums[i]); //不相等就交换
            }
        }
        //排序好后再遍历
        for(int i = 0;i<n;++i){
            if(nums[i]!=i+1){
                return i+1;
            }
        }

        //否则就都存在 返回n+1的值
        return n +1;
    }
};
相关推荐
吃好睡好便好2 小时前
提取矩阵某一行或某一列元素
开发语言·人工智能·线性代数·算法·matlab·矩阵
圣保罗的大教堂5 小时前
leetcode 2540. 最小公共值 简单
leetcode
Raink老师6 小时前
【AI面试临阵磨枪-69】如何设计一个支持百万级工具的 Agent 系统?如何快速路由与选择工具?
人工智能·面试·职场和发展
云泽8086 小时前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算
ʚ希希ɞ ྀ6 小时前
不同路径|| -- dp
算法
IT 行者7 小时前
SimHash 与 MinHash:相似性计算的双子星算法
算法·hash·比对
智者知已应修善业7 小时前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业7 小时前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
小L~~~9 小时前
基于贪心策略的混合遗传算法求解01背包问题
python·算法