Leetcode刷题第四天-双指针-二分法

15:三个数之和

链接:15. 三数之和 - 力扣(LeetCode)

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 re
threeSum

18:四个数之和

链接:18. 四数之和 - 力扣(LeetCode)

和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                     
25         
fourSum

1:两个数之和

链接:1. 两数之和 - 力扣(LeetCode)

哈希就行,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 []
10         
twoSum

**********************************************************************************************************************************************************************

双指针暂时告一段落,开启二分法之旅

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])/2
findMedianSortedArrays

 

posted @ 2024-01-26 18:04  小小小茹茹  阅读(11)  评论(0编辑  收藏  举报