zoukankan      html  css  js  c++  java
  • [Leetcode][Python]41: First Missing Positive

    # -*- coding: utf8 -*-
    '''
    __author__ = 'dabay.wang@gmail.com'

    41: First Missing Positive
    https://oj.leetcode.com/problems/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.

    ===Comments by Dabay===
    要求O(n)的时间,肯定不能常规排序,意思是只能扫描一次。
    因为对空间有要求,所以只能在已经有的空间上做文章。

    扫描的时候,当遇到正数,而且这个正数小于数组长度(因为如果大于数组长度,说明前面肯定缺少正数,同时也没有(无需)位置来存储它),
    就把它交换到下标和它一样的位置上。
    这样,扫描完成之后,从1的位置开始判断,如果位置k上存的数字不是k,这就是缺少的第一个正数。

    这道题有三个需要注意的地方:
    - 交换之后,下标不能移动,需要继续判断。
    - 可能从1开始到最后都没有缺少的正数,此时下一个正数可能放在第一个位置上。
    - 当数组长度为0时,直接返回1.
    '''

    class Solution:
    # @param A, a list of integers
    # @return an integer
    def firstMissingPositive(self, A):
    if len(A) == 0:
    return 1
    i = 0
    while i < len(A):
    if A[i] > 0 and A[i] < len(A) and A[A[i]] != A[i]:
    A[A[i]], A[i] = A[i], A[A[i]]
    else:
    i = i + 1
    for x in xrange(1, len(A)):
    if A[x] != x:
    return x
    else:
    if A[0] == len(A):
    return len(A) + 1
    else:
    return len(A)


    def main():
    s = Solution()
    print s.firstMissingPositive([3,4,-1,1])


    if __name__ == "__main__":
    import time
    start = time.clock()
    main()
    print "%s sec" % (time.clock() - start)
  • 相关阅读:
    2. Redis哨兵、复制、集群的设计原理与区别
    1. 详解Redis的存储类型、集群架构、以及应用场景
    博客园主题优化
    【Java基础】Java面试题精选
    【Java集合】——集合类分析总结
    新零售供应链的三大闭环
    Comparable和Comparator比较实现排序 场景分析
    Java基础-枚举类
    Java基础-泛型
    微服务架构~BFF和网关
  • 原文地址:https://www.cnblogs.com/Dabay/p/4351968.html
Copyright © 2011-2022 走看看