emm今天刷了好几题。。有一题是合并两个已经排序好的链表的,由于我已经写过了合并多个已排序好链表的算法。。这里就不贴了。。这次题目如下:
41. First Missing Positive
Given an unsorted integer array, find the smallest missing positive integer.
Example 1:
Input: [1,2,0]
Output: 3
Example 2:
Input: [3,4,-1,1]
Output: 2
Example 3:
Input: [7,8,9,11,12]
Output: 1
Note:
Your algorithm should run in O(n) time and uses constant extra space.
这个Note很重要,他要求了O(n)的时间复杂度
看到题目的unsorted,我第一感觉就是先排序,由于快排的复杂度是O(log n)是小于O(n)的,所以是可以用的
当然在这里我没有手写一个快排,快排确实非常实用,下次我会分别用java、python、c++实现一个快排。。
Java和C++的库是直接有快排的,都可以直接用。
对于这个题目,我首先会使用快速排序,然后如果没要求O(n),我就干脆直接暴力比较了。。由于要求了O(n),那我们就应该是需要分析好数组下标与其对应数字的关系,毕竟数组下标是0,1,2,3...我们加上1后,就变成了1,2,3,4...只要看看用这个序列去跟数组内容比较,看缺哪个就返回哪个就OK了,暴力比较完全是可以用O(n^2)的。。我在这里就算是小作弊了一下
java Arraylist类下面是有一个叫contains的方法,直接可以判断列表中是否包含这个对象。
所以我可以把数组转化成Arraylist,然后直接用contains方法,判断是否包含1,2,3,4....这个序列,找到不包含就直接返回当前数字,如果都包含了,直接返回数组长度加1就可以了。
代码如下:
class Solution {
public int firstMissingPositive(int[] nums) {
if(nums.length == 0)
return 1;
Arrays.sort(nums);
ArrayList<Integer> answer_list = new ArrayList<Integer>();
for(int i = 0;i < nums.length;i++){
answer_list.add(nums[i]);
}
for(int i = 0;i < nums.length;i++){
if(!answer_list.contains(i + 1))
return i + 1;
}
return nums.length + 1;
}
}
确实是有点投机取巧啦2333,我也没认真研究过contains方法的具体函数。。。
虽然这个代码在leetcode是过了,但是嘛。。
如果contains是O(n)那么结合外循环这妥妥的O(n^2)了。。明显是不符合规则的。。
要是能有其他方法以后会贴上来emm