2025年- H15-Lc123-41.缺失的第一个正数(普通数组)---java版
1.题目描述
2.思路
例子1:
将非正数全部替换成 n+1,因为我们只关心 [1, n] 范围内的正整数,所以把所有 ≤ 0 的数变成 n+1(一定不在 [1, n] 范围中)。
例子2:
思路2:
3.代码实现
class Solution {public int firstMissingPositive(int[] nums) {//首先查看数组个数,了解区间范围int n=nums.length;//如果遇到负数,直接置成1-N之外的数,比如N+1for(int i=0;i<n;i++){if(nums[i]<=0){nums[i]=n+1;}}//3.把数组中在区间1~n遇到的数字标记为负数,代表已经遇见过for(int i=0;i<n;i++){//获取当前的数字???不懂int num=Math.abs(nums[i]);//在第二个循环中,我们遍历数组时需要获取每个元素的绝对值,这是因为在标记过程中,我们已经将某些数字的对应位置标记为了负数。当我们再次遇到这些数字时,我们需要使用绝对值来避免错误地修改已经标记过的元素。//假设我们遇到了一个已经被标记为负数的位置(表示这个数字已经出现),为了避免再次误操作,我们需要取绝对值。这样我们就能正确处理负数和正数之间的关系。if(num<=n){nums[num-1]=-Math.abs(nums[num-1]);}}for(int i=0;i<n;i++){if(nums[i]>0){return i+1;}}return n+1;}
}
方法二:
import java.awt.font.NumericShaper;public class H41 {public int firstMissingPositive(int[] nums) {int n=nums.length;for(int i=0;i<n;++i) {//索引从0~n-1,元素从1~n//比如索引2的位置应该放着元素3,所以nums[2]=3while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {//如果该元素没在对应的索引上,则交换两者位置,//原始的nums={3,4,-1,1},交换完的nums={1,-1,3,4},正确区间1,2,3,4int temp = nums[nums[i] - 1];nums[nums[i] - 1] = nums[i];nums[i] = temp;}}//断当前位置 i 上的数字是不是 i + 1。如果不是,说明 i + 1 这个正整数缺失了,就立即返回它。for(int i=0;i<n;i++){if(nums[i]!=i+1){return i+1;}}//for 循环没找到错误位置,说明 1 到 n 的整数都在数组中,那缺的数就是 n + 1return n+1;}public static void main(String[] args){H41 test06=new H41();int[] nums={3,4,-1,1};int res= test06.firstMissingPositive(nums);System.out.println("缺失的第一个正整数"+res);}
}