*LeetCode 41. First Missing Positive 思维题

本文深入探讨了如何在给定数组中找到缺失的第一个正整数,通过理解数组内元素的性质和使用特定技巧来实现高效求解。文章详细介绍了两个关键的trick,帮助读者掌握这一经典问题的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://leetcode.com/problems/first-missing-positive/


如果是只缺一个数的话,好说,就是求和, 然后n*(n+1)/2 -sum  就是缺的数字

但是,,,这道题,这样的数据也是要求有正确结果的:

3

1 4 5


这类题最终要的是:找到一些性质

这个题需要理解的性质是,假设缺的数是ans,那么他应该出现在下标为ans-1 的位置

而且下标为0 ~ ans-2都是符合nums[i] = i+1


有两个trick:

(1)如果现在的序列已经是,比如数组大小是3, 1-3都有,那么应该返回数组长度+1

(2)有重复的数字的时候,这个时候可能死循环,比如2应该放到第1个位置,那么再遇到一个2,就要跟第一个位置的2交换了,就这样死循环,,,,

所以无效的交换不要做

测试数据:
2

1 1

应该返回2

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>

using namespace std;

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int ptr=0;
        while(ptr<nums.size()) {
            if(nums[ptr] == ptr+1 || nums[ptr]<=0 || nums[ptr]>=nums.size() || nums[ptr] == nums[ nums[ptr]-1 ]) ptr++;
            else {
                //cout << nums[ptr] << " , " << nums[ nums[ptr]-1 ] << endl;
                swap(nums[ptr], nums[ nums[ptr]-1 ]);
            }

        }
        for(int i=0;i<nums.size();i++)
            if(nums[i] != i+1)return i+1;
        return nums.size()+1;
    }
};

int main() {
    int n,in;
    while(cin >> n) {
        vector<int> ivec;
        for(int i=0;i<n; i++) {
            cin >> in;
            ivec.push_back(in);
        }
        Solution s;
         cout << s.firstMissingPositive(ivec) << endl;
    }

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值