广州代做网站,网站怎么做seo步骤,怎么制作网站上传视频,网站站内优化方案题目描述
给定一个未排序的整数数组#xff0c;找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3示例 2:
输入: [3,4,-1,1]
输出: 2示例 3:
输入: [7,8,9,11,12]
输出: 1说明:
你的算法的时间复杂度应为O(n)#xff0c;并且只能使用常数级别的空间。
…题目描述
给定一个未排序的整数数组找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3示例 2:
输入: [3,4,-1,1]
输出: 2示例 3:
输入: [7,8,9,11,12]
输出: 1说明:
你的算法的时间复杂度应为O(n)并且只能使用常数级别的空间。
解题
题目要求时间复杂度O(n)空间复杂度O(1)。只需要原数组做位图即可代码如下
public int firstMissingPositive(int[] nums) {if(numsnull || nums.length1) {return 1;}int n nums.length;//原数组做bitmap//缺失的数字肯定在1~n之间//1.先判断数组中是否包含1//2.先纯净化数组将所有负数和0和大于n的数 都转换成1//3.遍历数组找到nums[i]设置对应的nums[nums[i]]为负值注意只翻转一次n存到nums[0]上//4.此时只需要从左遍历找到第一个大于0的数即可。boolean contains false;for(int num:nums) {if(num 1) {contains true;break;}}if(!contains) {return 1;}if(n1) {return 2;}for(int i0;in;i) {if(nums[i]0 || nums[i]n) {nums[i]1;}}int val0;for(int i0;in;i) {if(nums[i] ! 1) {val Math.abs(nums[i]);if(val!n) {nums[val] -Math.abs(nums[val]);}else {nums[0] n;}}}for(int i1;in;i) {if(nums[i]0) {return i;}}if(nums[0] ! n) {return n;}return n1;}