LeetCode 41. 缺失的第一个正数
新手学习中,有任何错误或者更好地方法、思路欢迎指教!
#Array 6
题目难度:困难
题目描述:
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗? 示例 1: 输入:nums = [1,2,0] 输出:3 示例 2: 输入:nums = [3,4,-1,1] 输出:2 示例 3: 输入:nums = [7,8,9,11,12] 输出:1 提示: 0 <= nums.length <= 300 -2^31 <= nums[i] <= 2^31 - 1 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/first-missing-positive 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. 山路十八弯解法:
思路:
遍历数组,判断missing是否出现过,没出现过则count++。
当count等于数组长度时代表数组中没有该missing值,返回missing;否则missing++继续下一轮数组遍历。
max为数组中的最大值,作为循环跳出的条件。
3 ms,36.4 MB
class Solution { public int firstMissingPositive(int[] nums) { int missing = 1; //没有出现的最小的正整数 int max = 0; //数组中的最大值(注意要赋初值!!!) int count; //数组中不与missing重复的数的个数 if (nums.length > 0){ max = nums[0]; do{ count = 0; for (int i = 0; i < nums.length; i++){ //遍历数组,判断missing是否出现过 if (nums[i] == missing){ continue; } else { count++; } if (nums[i] > max){ //查找数组中的最大值 max = nums[i]; } } if (count == nums.length) { //当数组中没有与missing重复的数时(missing未出现) return missing; } else missing++; } while (missing <= max); } return missing; } }