首页 > 其他分享 >Leetcode刷题第四天-双指针-二分法

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

时间:2024-01-26 18:11:24浏览次数:23  
标签:lens return nums int List len 二分法 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

 

标签:lens,return,nums,int,List,len,二分法,Leetcode,刷题
From: https://www.cnblogs.com/xiaoruru/p/17990397

相关文章

  • [LeetCode] 2859. Sum of Values at Indices With K Set Bits
    Youaregivena0-indexedintegerarraynumsandanintegerk.Returnanintegerthatdenotesthesumofelementsinnumswhosecorrespondingindiceshaveexactlyksetbitsintheirbinaryrepresentation.Thesetbitsinanintegerarethe1'sprese......
  • 码农面试宝典之leetcode刷题手册
    今年的经济形势和行业状况可以说对求职者来说很不友好,你们是否曾因为面对编程面试题而感到迷茫?是否渴望提升自己的算法技能顺利跨入大厂?让我向你们推荐一项强大的利器——LeetCode刷题手册,它将成为你找到理想工作的秘密武器。LeetCode作为全球最受欢迎的在线编程平台之一,不仅拥有......
  • #yyds干货盘点# LeetCode程序员面试金典:和为 K 的子数组
    题目给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的子数组的个数。子数组是数组中元素的连续非空序列。 示例1:输入:nums=[1,1,1],k=2输出:2示例2:输入:nums=[1,2,3],k=3输出:2 代码实现publicclassSolution{publicintsubarr......
  • #yyds干货盘点# LeetCode程序员面试金典:左叶子之和
    题目给定二叉树的根节点root,返回所有左叶子之和。 示例1:输入:root=[3,9,20,null,null,15,7] 输出:24 解释:在这个二叉树中,有两个左叶子,分别是9和15,所以返回24示例2:输入:root=[1]输出:0代码实现classSolution{publicintsumOfLeftLeaves(Tr......
  • Leetcode刷题第三天-贪心-双指针
    738:单调递增链接:738.单调递增的数字-力扣(LeetCode)嘶~介个介个恶心心,从后往前遍历,前一个数比当前数大,前一个数-1,当前数变为9需要注意的是,保证每个9后面全是9100,第一轮遍历完时90T_T1classSolution:2defmonotoneIncreasingDigits(self,n:int)->int:3......
  • C# 二分法查询代码
    二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。使用二分法的前提条件是:在有序数组中查找特定元素publicstaticintSearchInsert(int[]nums,inttarget){intstart=0;//开始索引intend=nums.Length-1;//结束索引i......
  • c++学习由浅入深刷题指南
    新手村任何一个伟大的目标,都有一个微不足道的开始。洛谷的第一个任务勇敢的迈出第一步,了解下语言和洛谷。跟着书本和老师走,不会难的。P1000P1001P1421P1425顺序与分支计算机的智能性开始得以体现,因为计算机能够根据不同的条件选择了。P1422P1085P1089P1909循环!......
  • 每日刷题 凯撒密码
    一.题目给定一个单词,请使用凯撒密码将这个单词加密。凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变成d,b变成e,…,w变成z,x变成a,y变成b,z变成c。二.题目要求1.输入要求输入一行,包含一个单词,单词中只包含一个小写英文字母,单词中的......
  • Leetcode刷题第二天-贪心
    655:非递减数列链接:665.非递减数列-力扣(LeetCode)直接找最大最小值进行替换不行,[1,5,4,6,7,8,9]最大最小值所处位置可能是非递减数列如果nums[i]>nums[i+1],当前这俩个数递减,修改谁,记录前一个数,比较前一个数和当前数的大小,前一个数大,小变大,后一个数大,大变小统计次数,出现两次......
  • templeetcode 22.括号生成
    leetcode22.括号生成第二十二题:括号生成1.回溯:publicList<String>generateParenthesis(intn){List<String>ans=newArrayList<String>();backtrack(ans,newStringBuilder(),0,0,n);returnans;}publicvoidbackt......