[leetcode]41. First Missing Positive

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值