lintcode 中等题:First Missing Positive 丢失的第一个正整数

题目

丢失的第一个正整数

给出一个无序的整数数组,找出其中没有出现的最小正整数。

样例

如果给出 [1,2,0], return 3 如果给出 [3,4,-1,1], return 2

挑战

只允许时间复杂度O(n)的算法,并且只能使用常数级别的空间。

解题 

感觉好像好像很复杂,通过率21%也是比较低的了。

找了一个很不好的方法

步骤:

1.先找出数组中正整数的最小值,Min

2.若Min>1 显然最小的不在数组中的正整数就是1

3.这里的都是最小值Min == 1的情况

对于这个情况,只需要判断  对最小的i, Min + i 是否在数组中的正整数部分,这里需要定义一个ArrayList存放正整数部分的数,方便判断Min+i是否在ArrayList中。最小的i对于的Min+i就是答案。

这里时间复杂度和空间复杂度都是O(N)

public class Solution {
    /**
     * @param A: an array of integers
     * @return: an integer
     */
    public int firstMissingPositive(int[] A) {
        // write your code here
        if(A.length ==0)
            return 1;
        // if(A.length ==1){
        //     if(A[0]<= 0)
        //         return 1;
        //     return A[0]+1;
        // }
        // 1.找到正数的最小值
        // 2.最小值>1 return 1
        // 3.最小值<0 return 1
        // 4.最小值是1,最小值向上加 1 不存在的话就是答案
        int Min = Integer.MAX_VALUE;
        int MinInt = Integer.MAX_VALUE;
        ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i=0;i< A.length;i++){
            if(A[i]>0){
                list.add(A[i]);
                if(A[i] < Min)
                    Min = A[i];
            }
        }
        if(Min>1 )
            return 1;
        int i = 1;
        // 最小值等于 1
        while(i<= A.length){
            if(!list.contains(Min + i)){
                MinInt = Min + i;
                break;
            }
            i = i + 1;
        }
        return MinInt;
    }
}

Java Code

总耗时: 2210 ms

这个和寻找缺失的数好像很像,虽然改写后的程序,理解不透,但是LeetCode的测试样例,造成无法通过

样例:[1,1]这样会陷入死循环。

程序如下

public class Solution {
    /**
     * @param A: an array of integers
     * @return: an integer
     */
    public int firstMissingPositive(int[] A) {
        // write your code here
        if(A.length == 0)
            return 1;
        int n = A.length;
        for(int i =0 ;i< n ;i++){
            while(A[i] != i + 1){
                if(A[i] <= 0 || A[i] > n)
                    break;
                int tmp = A[i];
                A[i] = A[tmp - 1];
                A[tmp - 1] = tmp;
            }
        }
        for(int i =0;i< n ;i++)
            if( A[i] != i+ 1)
                return i+1;
        return n + 1;
    }
}

Java Code

class Solution:
    # @param A, a list of integers
    # @return an integer
    def firstMissingPositive(self, A):
        # write your code here
        if A == None:
            return 1
        n = len(A)
        nums = A[:]
        for i in range(n):
            while A[i] != i+1:
                nums = A[:]
                if A[i]<=0 or A[i]>=n:
                    break
                tmp = A[i]
                A[i] = A[tmp-1]
                A[tmp-1] = tmp
                # print ‘before:‘,nums
                # print ‘later:‘,A
        for i in range(n):
            if A[i]!= i +1:
                return i+1
        return n +1
                

Python Code

时间: 2024-10-12 13:53:46

lintcode 中等题:First Missing Positive 丢失的第一个正整数的相关文章

leetcode第40题--First Missing Positive

题目: 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,5,4]那就是缺3. 思路

lintcode 中等题:find the missing number 寻找缺失的数

题目 寻找缺失的数 给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数. 样例 N = 4 且序列为 [0, 1, 3] 时,缺失的数为2. 注意 可以改变序列中数的位置. 挑战 在数组上原地完成,使用O(1)的额外空间和O(N)的时间. 解题 重新定义一个数组存放排序后的数,空间复杂度和时间复杂度都是O(N) public class Solution { /** * @param nums: an array of integers * @retur

lintcode 中等题:next permutation下一个排列

题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] 注意 排列中可能包含重复的整数 解题 和上一题求上一个排列应该很类似 1.对这个数,先从右到左找到递增序列的前一个位置,peakInd 2.若peakInd = -1 这个数直接逆序就是答案了 3.peakInd>= 0 peakInd这个位置的所,和 peakInd 到nums.size() -1

lintcode 中等题:maximum subarray difference 最大子数组差

题目 最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 样例 给出数组[1, 2, -3, 1],返回 6 注意 子数组最少包含一个数 挑战 时间复杂度为O(n),空间复杂度为O(n) 解题 刚做了数组中两个子数组和的最大值,这一题是求差,感觉上题的求解思想应该是可以用的 A B 分别是两个子数组的和,则: 所以 当A>B 的时候A越大越好 B越小越好 当A<B 的时候B越大越好 A越小越好

lintcode 中等题:continuous subarray sum 联系子数组之和

题目 连续子数组求和 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.(如果两个相同的答案,请返回其中任意一个) 样例 给定 [-3, 1, 3, -3, 4], 返回[1,4]. 解题 法一:直接暴力,时间复杂度O(N2),时间超时 public class Solution { /** * @param A an integer array * @return A list of integers includes the i

lintcode 中等题:maximum subarray最大子数组II

题目 最大子数组 II 给定一个整数数组,找出两个不重叠子数组使得它们的和最大. 每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 您在真实的面试中是否遇到过这个题? Yes 样例 给出数组[1, 3, -1, 2, -1, 2],这两个子数组分别为[1, 3]和[2, -1, 2]或者[1, 3, -1, 2]和[2],它们的最大和都是7 注意 子数组最少包含一个数 挑战 要求时间复杂度为O(n) 解题 最大子数组I 这个题目是求一个数组中一个最大子数组的和,而本题目是求数组中的前

lintcode 中等题: Implement Trie

题目 Implement Trie Implement a trie with insert, search, and startsWith methods. 样例 注意 You may assume that all inputs are consist of lowercase letters a-z. 解题 Trie,字典树,又称单词查找树.前缀树,是一种哈希树的变种.应用于字符串的统计与排序,经常被搜索引擎系统用于文本词频统计. 性质: 1.根节点不包含字符,除根节点外的每一个节点都只包

lintcode 中等题: 3 Sum II 三数之和II

题目 三数之和 II 给一个包含n个整数的数组S, 找到和与给定整数target最接近的三元组,返回这三个数的和. 样例 例如S = [-1, 2, 1, -4] and target = 1.  和最接近1的三元组是 -1 + 2 + 1 = 2. 注意 只需要返回三元组之和,无需返回三元组本身 解题 和上一题差不多,程序也只是稍微修改了 public class Solution { /** * @param numbers: Give an array numbers of n integ

lintcode 中等题:sort letters by case字符大小写排序

题目 字符大小写排序 给定一个只包含字母的字符串,按照先小写字母后大写字母的顺序进行排序. 您在真实的面试中是否遇到过这个题? Yes 样例 给出"abAcD",一个可能的答案为"acbAD" 注意 小写字母或者大写字母他们之间不一定要保持在原始字符串中的相对位置. 挑战 在原地扫描一遍完成 解题 这个题目很简单,前面刚做一个把大于某个数之和的排在后面,快速排序的思想 public class Solution { /** *@param chars: The le