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

力扣 41. 缺失的第一个正数

🔗 https://leetcode.cn/problems/first-missing-positive

题目

  • 给定一个数组,有正数有负数,未排序,返回没有出现的最小的正数
  • 要求时间复杂度o(n),使用常数级别额外空间

思路

  • solution 1
    • 用 set 保存所有大于零的数,从 1 开始遍历,直到找不到,便是缺失的第一个正数
    • 时间复杂度满足要求,空间复杂度超标,不能代码可以 AC
  • solution 2
    • 用了一个很巧妙的空间复用,利用当前的 nums 数组,使得 nums[index] 对应数字 index + 1,这样从 0 开始遍历,找到的第一个 index + 1 ≠ nums[index] 的,就是缺失的第一个正数,如果都有,那缺失的第一个正数就是 nums.size() + 1
    • 设置数组 index + 1 = nums[index] 的方式,就是判断当前的元素是否是 1-N 之间,若在则把这个数字通过交换放在对应的位置上

代码

class Solution {
public:
    int solution1(vector<int>& nums) {
        unordered_set<int> s;
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] > 0) s.insert(nums[i]);
        }
        int ans = 1;
        while (s.find(ans) != s.end()) ans++;
        return ans;
    }
    int solution2(vector<int>& nums) {
        int n = nums.size();
        for (int i = 0; i < nums.size(); i++) {
            while (nums[i] > 0 && nums[i] <= n && i != (nums[i]-1)) {
                int curr_num = nums[i];
                if (curr_num == nums[curr_num -1]) break;
                nums[i] = nums[curr_num-1];
                nums[curr_num-1] = curr_num;  
            }
        }
        for (int i = 0; i < n ; i++) {
            if (nums[i] != (i+1)) return i+1;
        }
        return n+1;
    }

    int firstMissingPositive(vector<int>& nums) {
        //return solution1(nums);
        return solution2(nums);
        
    }
};

http://www.kler.cn/a/409210.html

相关文章:

  • Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
  • 云计算-华为HCIA-学习笔记
  • 部署自动清理任务解决ORA-00257: archiver error. Connect internal only, until freed
  • docker安装使用Elasticsearch,解决启动后无法访问9200问题
  • 《Qt Creator:人工智能时代的跨平台开发利器》
  • 后端:事务
  • 【tomcat】tomcat的默认配置
  • 【Linux】详解shell代码实现(上)
  • postman 调用 下载接口(download)使用默认名称(response.txt 或随机名称)
  • A045-基于spring boot的个人博客系统的设计与实现
  • 数据结构 ——— 希尔排序算法的实现
  • 鸿蒙NEXT开发案例:二维码的生成与识别
  • Redis核心数据结构与高性能原理
  • LLM的原理理解6-10:6、前馈步骤7、使用向量运算进行前馈网络的推理8、注意力层和前馈层有不同的功能9、语言模型的训练方式10、GPT-3的惊人性能
  • leetcode 面试150之 156.LUR 缓存
  • c++中mystring运算符重载
  • 韩顺平 一周学会Linux | Linux 实操篇-实用指令
  • Python知识点精汇:集合篇精解!
  • 【大数据技术与开发实训】携程景点在线评论分析
  • HTMLCSS:翻书加载效果
  • 解!决!vscode!Path Intellisense 失效!不起作用问题!!
  • 机器学习实战笔记34-38:gridsearchcv的进阶使用,无监督学习:kmeans、DBSCAN
  • web网络安全系统
  • 深入浅出:大数据架构中的流处理与实时分析
  • 微服务系列概览
  • Momenta C++面试题及参考答案