LeetCode 41. 缺失的第一个正数

缺失的第一个正数

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

方法一、哈希表法

哈希+标志位解决此问题。

实际上,对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1,N+1] 中。

  1. 将数组中小于等于0的数转成N+1
  2. 将<=cnt的元素对应位置变为负数
  3. 返回第一个大于零的元素下标+1

Swift

swift 复制代码
func firstMissingPositive(_ nums: [Int]) -> Int {
        
        var nums = nums
        let cnt = nums.count
        
        //1.将数组中小于等于0的数转成N+1
        for (i, num) in nums.enumerated() {
            if  num <= 0 {
                nums[i] = cnt + 1
            }
        }
        
        //2.将<=cnt的元素对应位置变为负数
        for num in nums where num <= cnt {
            nums[num-1] = -abs(nums[num-1])
        }
        
        //3.返回第一个大于零的元素下标+1
        for i in 0..<cnt {
            if nums[i] > 0 {
                return i+1
            }
        }
        
        return cnt+1
    }

OC

c 复制代码
- (NSInteger)firstMissingPositive:(NSArray *)nums {
    
    NSMutableArray *numsM = [nums mutableCopy];
    NSInteger cnt = numsM.count;
    
    //1.将数组中小于等于0的数转成N+1
    for (NSInteger i=0; i<cnt; i++) {
        if ([numsM[i] integerValue] <= 0) {
            numsM[i] = [NSNumber numberWithInteger:cnt+1];
        }
    }
    
    //2.将<=cnt的元素对应位置变为负数
    for (NSInteger i=0; i<cnt; i++) {
        NSInteger num = [numsM[i] integerValue];
        
        if (num <= cnt) {
            numsM[num-1] = [NSNumber numberWithInteger:-labs([numsM[num-1] integerValue])];
        }
    }
    
    //3.返回第一个大于零的元素下标+1
    for (NSInteger i=0; i<cnt; i++) {
        if ([numsM[i] integerValue] > 0) {
            return i+1;
        }
    }
    
    return cnt+1;
}
相关推荐
三毛的二哥6 小时前
BEV:典型BEV算法总结
人工智能·算法·计算机视觉·3d
南宫萧幕7 小时前
自控PID+MATLAB仿真+混动P0/P1/P2/P3/P4构型
算法·机器学习·matlab·simulink·控制·pid
故事和你918 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
我叫黑大帅8 小时前
为什么map查找时间复杂度是O(1)?
后端·算法·面试
炽烈小老头9 小时前
【每天学习一点算法 2026/04/20】除自身以外数组的乘积
学习·算法
skilllite作者9 小时前
AI agent 的 Assistant Auto LLM Routing 规划的思考
网络·人工智能·算法·rust·openclaw·agentskills
破浪前行·吴10 小时前
数据结构概述
数据结构·学习
py有趣11 小时前
力扣热门100题之不同路径
算法·leetcode
_日拱一卒11 小时前
LeetCode:25K个一组翻转链表
算法·leetcode·链表
啊哦呃咦唔鱼11 小时前
LeetCodehot100-394 字符串解码
算法