lincode 题目记录6

the Duplicate Number  132 PatternFind

找重复的数字··直接暴力枚举是不行的···又超时提示··

暴力枚举的写法·

   res=0
    def findDuplicate(self, nums):
        # Write your code here
      #或者这么写
    #for i in range(len(nums)):
          # if nums[i] in nums[i+1:]:return nums[i]
        def findmid(arr):
            if len(arr)<=1:return
            global res
            mid=arr[0]
            low=[]
            high=[]
            for i in range(1,len(arr)):
                if arr[i]>mid:
                    high.append(arr[i])
                elif(arr[i]<mid):low.append(arr[i])
                else:
                    res=mid
                    return
            findmid(low)
            findmid(high)

        findmid(nums)
        return res

python的闭包写法有点怪··这里用了一个全局变量来实现闭包,也可以在外边函数里边声明res 嵌套函数里边用nonlobal,但是lintcode的编译器好像不识别这个···或者直接用list···

这个写法会提示超时··而且也不满足题目要求··题目要求空间复杂度是O(1),这个新建数组了··

后来在网上查了下注意到题目里边说了·一定有n+1个数字··然后范围在1到n

 

    def findDuplicate(self, nums):
        # Write your code here
        min=0
        max=len(nums)-1
        while(min<max):
            mid=(min+max)//2
            cnt=0
            for i in nums:
                if i<=mid:
                    cnt+=1
            if cnt>mid:
                max=mid
            else:
                min=mid+1
        return min 

 132 PatternFind

直接遍历是不行的·就算设置了条件优化也不行····会超时·· 这个用栈的方法 有点流弊···逆序遍历取第二大的值为基准做对比·,这里second的初始值取-1000000,

class Solution:
    # @param {int[]} nums a list of n integers
    # @return {boolean} true if there is a 132 pattern or false
    def find132pattern(self, nums):
        # Write your code here
        second = -1000000   
        st = []
        for num in nums[::-1]:
            if num<second:
                return True
            while st and num>st[-1]:
                second=st.pop()
            st.append(num)
        return False

 

posted @ 2017-07-20 09:45  季末的寂寞  阅读(258)  评论(0编辑  收藏  举报