2026年LeetCode双周赛经典题目详解与算法解析_第1页
2026年LeetCode双周赛经典题目详解与算法解析_第2页
2026年LeetCode双周赛经典题目详解与算法解析_第3页
2026年LeetCode双周赛经典题目详解与算法解析_第4页
2026年LeetCode双周赛经典题目详解与算法解析_第5页
已阅读5页,还剩13页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年LeetCode双周赛经典题目详解与算法解析第一题:字符串处理与模式匹配(3题,每题10分)题目1:最长有效括号子串问题描述:给定一个由`'('`和`')'`组成的字符串`s`,返回其中最长的有效(括号正确匹配)子串的长度。有效括号子串是指由`'('`和`')'`组成的子串,其中每个`'('`都有一个对应的`')'`,且它们的位置一一对应。示例:输入:s="(()"输出:2解释:"()"是最长的有效括号子串。答案与解析:pythondeflongestValidParentheses(s:str)->int:stack=[-1]#初始化栈,-1作为基准点max_len=0fori,charinenumerate(s):ifchar=='(':stack.append(i)else:stack.pop()ifnotstack:stack.append(i)else:max_len=max(max_len,i-stack[-1])returnmax_len解析:使用栈来记录括号的索引位置。初始化栈为`[-1]`,作为基准点。遍历字符串:-遇到`'('`时,将其索引压入栈。-遇到`')'`时,弹出栈顶元素。如果栈为空,则将当前索引压入栈作为新的基准点;否则,计算当前有效子串的长度为`i-stack[-1]`,并更新最大长度。题目2:最长回文子串问题描述:给定一个字符串`s`,返回其中最长的回文子串的长度。回文子串是指正读和反读都相同的子串。示例:输入:s="babad"输出:3解释:"bab"或"aba"都是有效的最长回文子串。答案与解析:pythondeflongestPalindrome(s:str)->int:ifnots:return0start,end=0,0foriinrange(len(s)):len1=expandAroundCenter(s,i,i)len2=expandAroundCenter(s,i,i+1)max_len=max(len1,len2)ifmax_len>end-start:start=i-(max_len-1)//2end=i+max_len//2returnend-start+1defexpandAroundCenter(s:str,left:int,right:int)->int:whileleft>=0andright<len(s)ands[left]==s[right]:left-=1right+=1returnright-left-1解析:使用中心扩展法。遍历字符串的每个字符,将其作为回文中心,分别向左右扩展:-奇数长度回文:中心为单个字符。-偶数长度回文:中心为两个相同的字符。计算以当前中心扩展的最大回文长度,并更新最长回文子串的起始和结束位置。题目3:字符串解码问题描述:给定一个由数字和字母组成的字符串`s`,其中字母代表一个字符,数字`k`代表该字母重复`k`次。返回解码后的字符串长度。示例:输入:s="2a3bc4d"输出:10解释:"aaabcbcddd"的长度为10。答案与解析:pythondefnumDecodings(s:str)->int:ifnots:return0n=len(s)dp=[0](n+1)dp[0]=1#空字符串有一种解码方式dp[1]=0ifs[0]=='0'else1foriinrange(2,n+1):one_digit=s[i-1]two_digits=s[i-2:i]ifone_digit!='0':dp[i]+=dp[i-1]if'10'<=two_digits<='26':dp[i]+=dp[i-2]returndp[n]解析:使用动态规划。定义`dp[i]`为前`i`个字符的解码方式数量:-如果当前字符不为`'0'`,则可以单独解码,`dp[i]+=dp[i-1]`。-如果前两个字符在`"10"`到`"26"`之间,则可以组合解码,`dp[i]+=dp[i-2]`。初始化`dp[0]=1`(空字符串有一种解码方式),`dp[1]`根据第一个字符是否为`'0'`判断。第二题:数组与矩阵操作(4题,每题12分)题目4:三数之和问题描述:给定一个包含`n`个整数的数组`nums`,判断数组中是否存在三个元素`a`、`b`、`c`,使得`a+b+c=0`。请找出所有满足条件且不重复的三元组。示例:输入:nums=[-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]答案与解析:pythondefthreeSum(nums:List[int])->List[List[int]]:nums.sort()n=len(nums)res=[]foriinrange(n-2):ifi>0andnums[i]==nums[i-1]:continueleft,right=i+1,n-1whileleft<right:total=nums[i]+nums[left]+nums[right]iftotal==0:res.append([nums[i],nums[left],nums[right]])whileleft<rightandnums[left]==nums[left+1]:left+=1whileleft<rightandnums[right]==nums[right-1]:right-=1left+=1right-=1eliftotal<0:left+=1else:right-=1returnres解析:先对数组排序,然后固定第一个数`nums[i]`,使用双指针`left`和`right`在剩余部分寻找`nums[left]`和`nums[right]`使得三数之和为`0`:-如果`total==0`,则找到一个解,并跳过重复的数字。-如果`total<0`,则增加`left`以增大总和。-如果`total>0`,则减少`right`以减小总和。题目5:二维区域的岛屿数量问题描述:给定一个由`'0'`(代表水)和`'1'`(代表陆地)组成的二维网格`grid`,返回其中的岛屿数量。岛屿被水完全包围,且水平或垂直相邻的`'1'`形成一个岛屿。示例:输入:grid=[["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]]输出:3答案与解析:pythondefnumIslands(grid:List[List[str]])->int:ifnotgrid:return0rows,cols=len(grid),len(grid[0])count=0defdfs(r,c):ifr<0orc<0orr>=rowsorc>=colsorgrid[r][c]!='1':returngrid[r][c]='0'#标记已访问dfs(r+1,c)dfs(r-1,c)dfs(r,c+1)dfs(r,c-1)forrinrange(rows):forcinrange(cols):ifgrid[r][c]=='1':count+=1dfs(r,c)returncount解析:使用深度优先搜索(DFS)遍历二维网格:-遇到`'1'`时,将其标记为`'0'`并递归访问其上下左右邻居。-每次从`'1'`开始的DFS代表一个岛屿,计数加一。题目6:螺旋矩阵问题描述:给定一个`mxn`的矩阵`matrix`,返回其螺旋顺序。螺旋顺序是从左上角开始,按顺时针方向逐层遍历矩阵。示例:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]答案与解析:pythondefspiralOrder(matrix:List[List[int]])->List[int]:ifnotmatrix:return[]result=[]top,bottom=0,len(matrix)-1left,right=0,len(matrix[0])-1whiletop<=bottomandleft<=right:从左到右遍历上边forcinrange(left,right+1):result.append(matrix[top][c])top+=1从上到下遍历右边forrinrange(top,bottom+1):result.append(matrix[r][right])right-=1iftop<=bottom:从右到左遍历下边forcinrange(right,left-1,-1):result.append(matrix[bottom][c])bottom-=1ifleft<=right:从下到上遍历左边forrinrange(bottom,top-1,-1):result.append(matrix[r][left])left+=1returnresult解析:使用四个指针`top`、`bottom`、`left`、`right`表示当前遍历的边界:-从左到右遍历上边,然后上边指针`top`下移。-从上到下遍历右边,然后右边指针`right`左移。-从右到左遍历下边,然后下边指针`bottom`上移。-从下到上遍历左边,然后左边指针`left`右移。重复上述步骤直到遍历完所有元素。题目7:和为k的子数组问题描述:给定一个整数数组`nums`和一个整数`k`,返回子数组`nums[i..j]`的和等于`k`的个数。示例:输入:nums=[1,1,1],k=2输出:2解释:子数组[1,1]和[1,1]的和为2。答案与解析:pythondefsubarraySum(nums:List[int],k:int)->int:count=0prefix_sum=0hash_map={0:1}#前缀和为0的子数组有1个fornuminnums:prefix_sum+=numifprefix_sum-kinhash_map:count+=hash_map[prefix_sum-k]hash_map[prefix_sum]=hash_map.get(prefix_sum,0)+1returncount解析:使用前缀和和哈希表。定义`prefix_sum`为当前前缀和,`hash_map`记录前缀和出现的次数:-对于每个元素,更新`prefix_sum`。-如果`prefix_sum-k`在哈希表中,则说明存在一个子数组的和为`k`,计数加一。-更新哈希表,记录当前前缀和的出现次数。第三题:动态规划与贪心算法(2题,每题15分)题目8:爬楼梯问题描述:假设你正在爬楼梯,需要每次爬`1`或`2`阶。给定一个整数`n`,返回达到第`n`阶的方法总数。示例:输入:n=3输出:3解释:3种方法:1,1,1;1,2;2,1。答案与解析:pythondefclimbStairs(n:int)->int:ifn==1:return1dp=[0](n+1)dp[1],dp[2]=1,2foriinrange(3,n+1):dp[i]=dp[i-1]+dp[i-2]returndp[n]解析:使用动态规划。定义`dp[i]`为到达第`i`阶的方法数:-`dp[1]=1`(只有一种方法)-`dp[2]=2`(两种方法)-对于`i>=3`,`dp[i]=dp[i-1]+dp[i-2]`(从第`i-1`阶或第`i-2`阶爬一步到达)题目9:打家劫舍问题描述:有一个环形排列的房屋,每个房屋内有一定金额。你不能同时抢劫相邻的两个房屋,返

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论