难度困难426收藏分享切换为英文关注反馈
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
解题思路:
1、申请大小为numsize+1的辅助数组,并初始化为0
2、遍历nums数组,将数组中大于0并且小于等于numsize的元素值temp = (nums[i] - 1)
3、将temp值作为辅助数组的索引,并将该索引处的值赋值1或其他值非0值,即标识该索引+1的值在原数组nums中时存在的
4、遍历辅助数组,查找第一个非标识(1或其他非0值)的值时,返回索引+1,即为原数组中缺失的最小正整数
执行结果:
int firstMissingPositive(int* nums, int numsSize){
// 辅助数组,并初始化为0
int *arr = (int *)malloc((numsSize + 1) * sizeof(int));
memset(arr, 0, (numsSize + 1) * sizeof(int));
int i;
for (i = 0; i < numsSize; i++) {
// 将非0数字且小于等于数组长度数字放到辅助数组arr的n-1的索引上,并标识为1
if (nums[i] > 0 && nums[i] <= numsSize) {
arr[nums[i] - 1] = 1;
}
}
int res = 1;
for (i = 0; i <= numsSize; i++) {
// 辅助数组中查找值为0的索引位置i,并返回 i+1即为要求的解
if (arr[i] == 0) {
return i + 1;
}
}
return res;
}