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