那天面试,考了一道困难题,当时脑袋嗡嗡的,没想出来,后来回去看了,其实思路不难,冷静想想应该可以做出来的,可惜有点紧张了。估计面试也亮了
这道题是LeetCode的第41道题,缺失的第一个整数。
题目描述:给你一个未排序的整数数组,请你找出其中没有出现的最小正整数。要求时间复杂度O(n),空间复杂度O(1)
class Solution {
public int firstMissingPositive(int[] nums) {
int n=nums.length;
for(int i=0;i<n;i++){
while(nums[i]>0&&nums[nums[i]-1&&nums[i]!=nums[nums[i]-1]){
int temp=nums[nums[i]-1];//把nums对应的值放在对应的序号上,数字1要放到下标0上
nums[nums[i]-1]=nums[i];//所以为nums[nums[i]-1]
//使用while而不用if,是因为换过来的数字也需要换到对应的位置上去
nums[i]=temp;//
}
}
for(int i=0;i<n;i++){
if(nums[i]!=i+1)return i+1;//判断这个序号对应的是不是这个数,如果不是则返回这个数
}
return n+1;//如果前面的数和下标一一符合,那么返回n+1
}
}
分享面试中遇到的LeetCode第41题解法,探讨如何在压力下保持冷静,实现O(n)时间复杂度的解决方案。通过实例解析,了解如何利用while循环找出数组中缺失的最小正整数。

3万+

被折叠的 条评论
为什么被折叠?



