/*
41. 缺失的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
示例 3:
输入:nums = [7,8,9,11,12]
输出:1
提示:
1 <= nums.length <= 5 * 10^5
-2^31 <= nums[i] <= 2^31 - 1
https://leetcode.cn/problems/first-missing-positive/
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int firstMissingPositive(int* nums, int numsSize)
{
int i, max = 0;
int count = 0, min = 2^31 - 1;
for (i = 0; i < numsSize; i++) {
if (nums[i] < 1) {
continue;
}
count++;
if (nums[i] > max) {
max = nums[i];
}
if (nums[i] < min) {
min = nums[i];
}
}
//check if min > 1 or all <= 0 case
if ((min > 1) || (max < 1)) {
return 1;
}
//check for some continous area, like 1-3, 4-7, 9-11 case
if (count > (max - min + 1)) {
count = max - min + 1;
}
int *arr = (int *)malloc(sizeof(int) * count);
memset(arr, 0, sizeof(int) * count);
for (i = 0; i < numsSize; i++) {
if ((nums[i] < 1) || (nums[i] > count)) {
continue;
}
arr[nums[i] - 1] = 1;
}
for (i = 1; i < count; i++) {
if (arr[i] == 0) {
break;
}
}
free(arr);
return (i + 1);
}
int main(int argc, char *argv[])
{
int nums[] = {1,2,0};
//int nums[] = {2,3,4,-1,-2};
printf("first missing postive: %d\n", firstMissingPositive(nums, sizeof(nums)/sizeof(int)));
return 0;
}
空间上可能不满足,但用的也比较小了。