15:三个数之和
em...双冲for循环,从头去遍历,0-(a+b)是否在列表中,最终timeout
数组从小到大排序,设置三个指针,i从头遍历到lens-1,j从i+1开始,k从lens-1开始,sums==0,放入结果,大于0,k-1,小于0,j+1
如果i和i+1比较,相同跳过的话,会丢结果,i和i-1相等跳过,因为i-1已经在上一轮循环中检查过了,所以可以跳
jk就和他们下一个比较,相同跳过
i < j < k
如果nums[0]大于0,或者nums长度小于3,不存在这样的三元组
1 class Solution: 2 def threeSum(self, nums: List[int]) -> List[List[int]]: 3 if(not nums): return nums 4 if(len(nums)<3): return [] 5 nums.sort() 6 if(nums[0]>0): return [] 7 lens=len(nums) 8 re=[] 9 for i in range(lens-1): 10 if(i>0 and nums[i]==nums[i-1]): continue 11 j=i+1 12 k=lens-1 13 while j<k: 14 sums=nums[i]+nums[j]+nums[k] 15 if(sums>0): k-=1 16 elif(sums<0): j+=1 17 else: 18 re.append([nums[i],nums[j],nums[k]]) 19 while j<k and nums[j]==nums[j+1]: j+=1 20 while j<k and nums[k]==nums[k-1]: k-=1 21 j+=1 22 k-=1 23 return rethreeSum
18:四个数之和
和15一样,多加一层for
1 class Solution: 2 def fourSum(self, nums: List[int], target: int) -> List[List[int]]: 3 if(len(nums)<4): return [] 4 nums.sort() 5 lens=len(nums) 6 re=[] 7 for i in range(lens-3): 8 if(i>0 and nums[i]==nums[i-1]): continue 9 for k in range(lens-1,i,-1): 10 if(k<lens-1 and nums[k]==nums[k+1]): continue 11 j=i+1 12 z=k-1 13 while(j<z): 14 sums=nums[i]+nums[j]+nums[z]+nums[k] 15 if(sums>target): z-=1 16 elif(sums<target): j+=1 17 else: 18 re.append([nums[i],nums[j],nums[k],nums[z]]) 19 while j<z and nums[j]==nums[j+1]: j+=1 20 while j<z and nums[z]==nums[z-1]: z-=1 21 j+=1 22 z-=1 23 return re 24 25fourSum
1:两个数之和
哈希就行,target-nums[i] in nums[i+1:]即可return
1 class Solution: 2 def twoSum(self, nums: List[int], target: int) -> List[int]: 3 if(len(nums)<2): return [] 4 for i in range(len(nums)-1): 5 num=target-nums[i] 6 if(num in nums[i+1:]): 7 index=nums[i+1:].index(num)+i+1 8 return ([i,index]) 9 return [] 10twoSum
**********************************************************************************************************************************************************************
双指针暂时告一段落,开启二分法之旅
540:有序数组中的单一元素
链接:540. 有序数组中的单一元素 - 力扣(LeetCode)
找到中间元素,和左右对比,相等,检查左右元素个数,哪边为基数,往哪边找,都不等,就是它;没找到,跳出来了,左=右,这个就是
1 class Solution: 2 def singleNonDuplicate(self, nums: List[int]) -> int: 3 if(not nums): return 0 4 left,right=0,len(nums)-1 5 while left<right: 6 middle=left+(right-left)//2 7 print(left,right,middle) 8 if(nums[middle]==nums[middle-1]): 9 if((middle-left)%2==0): right=middle-2 10 else: left=middle+1 11 elif(nums[middle]==nums[middle+1]): 12 if((middle-left)%2==0): left=middle+2 13 else: right=middle-1 14 else: 15 return nums[middle] 16 print(left,right) 17 return nums[left]singleNonDuplicate
4:寻找两个数组的中位数
链接:4. 寻找两个正序数组的中位数 - 力扣(LeetCode)
合并,排序,找中间
1 class Solution: 2 def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: 3 if(not nums1 and not nums2): return 0 4 nums=nums1+nums2 5 nums.sort() 6 middle=len(nums)//2 7 if(middle==0): return nums[0] 8 if(len(nums)%2): return nums[middle] 9 else: return (nums[middle]+nums[middle-1])/2findMedianSortedArrays
标签:lens,return,nums,int,List,len,二分法,Leetcode,刷题 From: https://www.cnblogs.com/xiaoruru/p/17990397