leetcode题解-41. First Missing Positive
来源:互联网 发布:淘宝网话费充值中心 编辑:程序博客网 时间:2024/06/11 08:29
题目:
Given an unsorted integer array, find the first missing positive integer.For example,Given [1,2,0] return 3,and [3,4,-1,1] return 2.Your algorithm should run in O(n) time and uses constant space.
这道题目的是寻找第一个丢失的正数,在解题过程中主要遇到下面几种特殊的边界情况:
[1],[2],[-1,1],[-1,1000],[-1,1,1,1,2,22]
即可能两个数字之间差别很大,也可能会有重复数字出现。我看到题目的第一反应,是将其进行排序,这样可以很方便的找到丢失的正数。但是中间就遇到了这些边界情况,搞得跳了好几次。其实排序之后我们需要做的就是遍历数组,找到大于零且比前面一个正数大超过一的数字。代码入下:
public int firstMissingPositive(int[] nums) { if(nums.length == 0 || nums == null) return 1; Arrays.sort(nums); for(int i=0; i<nums.length; i++){ if(nums[i] > 0) if(nums[i] != 1) return 1; else{ //判断是否为突变点,并且排除相等的情况 while(i < nums.length-1 && (nums[i+1] == nums[i]+1 || nums[i+1] == nums[i])) i++; return nums[i]+1; } } return nums[nums.length-1]+1; }
看到题目的同时,脑海中还有另外一种解法,那就是使用一个数组来保存遍历过的正数,这样有一个问题,比如说[-1, 1000]这种情况下,我们申请的数组不够大怎么办,后来一想,如果出现了这种情况,那说明丢失的数字肯定在这之前。也就是说,我们原本的数组大小就足以支撑,只不过需要加一个限制条件,当某个元素大于数组长度时,不要把它保存到数组当中即可。代码入下:
public int firstMissingPositive1(int[] nums) { int n = nums.length; //该数组用于记录原数组信息,下标记录原数组的值 int[] tmp = new int[n+2]; for(int i=0; i<n; i++){ if(nums[i] > 0 && nums[i] < n+2){ tmp[nums[i]] = 1; } } for(int i=1; i<n+2; i++) if(tmp[i] != 1) return i; return 1; }
但是题目要求我们需要使用常数的存储空间。所以我们应该使用数组内部交换来实现,代码入下:
public int firstMissingPositive2(int[] A) { int i = 0; while(i < A.length){ if(A[i] == i+1 || A[i] <= 0 || A[i] > A.length) i++; else if(A[A[i]-1] != A[i]) swap(A, i, A[i]-1); else i++; } i = 0; while(i < A.length && A[i] == i+1) i++; return i+1; } private void swap(int[] A, int i, int j){ int temp = A[i]; A[i] = A[j]; A[j] = temp; }
阅读全文
0 0
- leetcode题解-41. First Missing Positive
- LeetCode 题解(7):First Missing Positive
- LeetCode题解——First Missing Positive
- LeetCode No.41 First Missing Positive 题解
- [LeetCode]41.First Missing Positive
- LeetCode --- 41. First Missing Positive
- LeetCode 41.First Missing Positive
- [Leetcode] 41. First Missing Positive
- [leetcode] 41.First Missing Positive
- leetCode 41. First Missing Positive
- LeetCode 41. First Missing Positive
- leetcode 41. First Missing Positive
- Leetcode 41. First Missing Positive
- LeetCode 41. First Missing Positive
- [leetcode]41. First Missing Positive
- LeetCode-41.First Missing Positive
- leetcode 41. First Missing Positive
- [LeetCode] 41. First Missing Positive
- cookie与session的区别
- 【正一专栏】识时务者为俊杰——致敬杜兰特
- mitmproxy移动端代理抓包(一)
- 2017 春季最酷、最受欢迎的 30 个 Android 库,快收藏!
- ionic开发——检测是否安装某APP,如果安装打开该APP
- leetcode题解-41. First Missing Positive
- linux信号基本概念及如何产生信号
- input之key(二)
- java程序员38道常规面试题
- 【代码笔记】iOS-TableViewOfTwoSecton
- 说一说Geotools
- Activity动画滑出滑进
- 读取配置文件的内容代码
- 编程实现遍历ACL访问控制列表检查进程访问权限