LeetCode_41_数组_缺失的第一个正数
Posted 軒邈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode_41_数组_缺失的第一个正数相关的知识,希望对你有一定的参考价值。
原创
/*
理解:
1.未排序的数组nums;
2.nums数组元素是整数,包括正整数和负整数;
3.找出没有出现的最小的正整数。
4时间复杂度:O(n),空间复杂度:常量级
思路:
1.忽略负整数和大于numsSize的的元素;
2.给在大小在[1, numsSize]区间的元素建立哈希表,元素数值给1;
3.遍历判断,只要在[1, numsSize]区间未出现的元素,最小的那个值就是缺失的;
4.如果在[1, numsSize]区间的元素都出现了,那么缺失最小的值就是numsSize+1的值。
*/
int firstMissingPositive(int* nums, int numsSize)
int *pArry = malloc((numsSize + 1) * sizeof(int)); /* 建立哈希表 */
if(pArry == NULL) /* 需要作判断下 */
return 0;
memset(pArry, 0, (numsSize + 1) * sizeof(int)); /* 先让元素初始化为0 */
for (int i = 0; i < numsSize; i++)
if (nums[i] <= 0) /* 满足负正整数条件下直接跳到 for 循环中的判断 */
continue;
if (nums[i] > numsSize) /* 大于numsSize时,也直接跳到 for 循环中的判断 */
continue;
pArry[nums[i]] = 1; /* 在区间内,给元素赋值为1 */
for (int i = 1; i <= numsSize; i++)
if (!pArry[i]) /* 当[1, numsSize] 最小下标对应的元素为0的话那么就是缺失的最小正整数 */
return i;
return numsSize + 1; /* 遍历完后没有在区间内找到,那么就是numsSize + 1为最小的 */
总结:
心静真的很不一样,静下来了,思维都变得清晰了!
以上是关于LeetCode_41_数组_缺失的第一个正数的主要内容,如果未能解决你的问题,请参考以下文章