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)
  • 相关阅读:
    python wxpython
    python tkinter的Label
    python tkinter开始
    cmd退出python
    数据库基本操作
    mysql中的key primary key 和unique key
    python 关于每个项目的解释器
    python3修改文件指定行和4种文件打开方式
    python3 变量格式化转换成字符串
    安装Gitlab到Ubuntu(APT)
  • 原文地址:https://www.cnblogs.com/Dabay/p/4351968.html
Copyright © 2011-2022 走看看