• [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)
  • 相关阅读:
    域名、主机名、网站名以及 URL 基础概念
    c# oracle 数据库连接以及参数化查询
    c# 委托(Func、Action)
    xcode pod install 安装失败,提示缺少文件
    一个服务器的IIS只能绑定一个HTTPS也就是443端口
    APP UI设计及切图规范
    Day7 字符串和常用数据结构
    Day6 函数和模块的使用
    Day5 练习
    python 疑难杂症
  • 原文地址:https://www.cnblogs.com/Dabay/p/4351968.html
Copyright © 2020-2023  润新知