2024.4.26——LeetCode 高频题复盘

2024-04-27 12:04
文章标签 leetcode 26 复盘 高频 2024.4

本文主要是介绍2024.4.26——LeetCode 高频题复盘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 3. 无重复字符的最长子串
  • 206. 反转链表
  • 146. LRU 缓存
  • 215. 数组中的第K个最大元素
  • 25. K 个一组翻转链表
  • 15. 三数之和
  • 53. 最大子数组和
  • 21. 合并两个有序链表
  • 1. 两数之和
  • 5. 最长回文子串
  • 912. 排序数组

3. 无重复字符的最长子串


题目链接

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:stack=[]max_cnt=0for c in s:while c in stack:stack.pop(0)stack.append(c)if len(stack)>max_cnt:max_cnt=len(stack)return max_cnt

206. 反转链表


题目链接

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:pre=Nonecur=headwhile cur:temp=cur.nextcur.next=prepre=curcur=tempreturn pre

146. LRU 缓存


题目链接

用到的数据结构:哈希表+双向链表

在这里插入图片描述

class ListNode:def __init__(self,key=None,value=None):self.key=keyself.value=valueself.pre=Noneself.next=Noneclass LRUCache:def __init__(self, capacity: int):self.capacity=capacityself.hashmap={}self.head=ListNode()self.tail=ListNode()self.head.next=self.tailself.tail.pre=self.headdef move_to_tail(self,key):node=self.hashmap[key]node.pre.next=node.nextnode.next.pre=node.prenode.next=self.tailnode.pre=self.tail.preself.tail.pre.next=nodeself.tail.pre=nodedef get(self, key: int) -> int:if key in self.hashmap:self.move_to_tail(key)res=self.hashmap.get(key,-1)if res==-1:return reselse:return res.valuedef put(self, key: int, value: int) -> None:if key in self.hashmap:self.hashmap[key].value=valueself.move_to_tail(key)else:if len(self.hashmap)==self.capacity:self.hashmap.pop(self.head.next.key)self.head.next=self.head.next.nextself.head.next.pre=self.headnewNode=ListNode(key,value)self.hashmap[key]=newNodenewNode.next=self.tailnewNode.pre=self.tail.preself.tail.pre.next=newNodeself.tail.pre=newNode# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)

注意:

  • 本题的数据结构:哈希表+双向链表
  • self总是忘记写

215. 数组中的第K个最大元素


题目链接

class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:return self.quickSelect(nums,k)def quickSelect(self,nums,k):pivot=random.choice(nums)big,equal,small=[],[],[]for num in nums:if num > pivot:big.append(num)elif num<pivot:small.append(num)else:equal.append(num)if k<=len(big):return self.quickSelect(big,k)elif k>len(nums)-len(small):return self.quickSelect(small,k-len(nums)+len(small))else:return pivot

25. K 个一组翻转链表


题目链接

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverse(self,head):cur=headpre=Nonewhile cur:temp=cur.nextcur.next=prepre=curcur=tempreturn predef reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:dummy=ListNode(next=head)pre,end=dummy,dummywhile end.next:for _ in range(k):if end:end=end.nextif not end:breaktemp=end.nextend.next=Nonestart=pre.nextpre.next=self.reverse(start)start.next=temppre,end=start,startreturn dummy.next

15. 三数之和


题目链接

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort()res=[]n=len(nums)for i in range(n):if nums[i]>0:return resif i>0 and nums[i]==nums[i-1]:continueL=i+1R=n-1while L<R:if nums[i]+nums[L]+nums[R]==0:res.append([nums[i],nums[L],nums[R]])while L<R and nums[L]==nums[L+1]:L+=1while L<R and nums[R]==nums[R-1]:R-=1L+=1R-=1elif nums[i]+nums[L]+nums[R]>0:R-=1else:L+=1return res  

53. 最大子数组和


题目链接

class Solution:def maxSubArray(self, nums: List[int]) -> int:# dp[i]表示nums中下标从0到i的部分,最大的子数组和n=len(nums)if n==1:return nums[0]dp=[0]*ndp[0]=nums[0]for i in range(1,n):if dp[i-1]>0:dp[i]=dp[i-1]+nums[i]else:dp[i]=nums[i]return max(dp)

21. 合并两个有序链表


题目链接

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:if not list1:return list2if not list2:return list1if list1.val<list2.val:list1.next=self.mergeTwoLists(list1.next,list2)return list1else:list2.next=self.mergeTwoLists(list2.next,list1)return list2

1. 两数之和


题目链接

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:hashmap={}for i,num in enumerate(nums):if target-num in hashmap:return [i,hashmap[target-num]]hashmap[num]=ireturn [] 

5. 最长回文子串


题目链接

class Solution:def longestPalindrome(self, s: str) -> str:n=len(s)dp= [[False]*n for _ in range(n)]begin=0max_len=1for i in range(n-1,-1,-1):for j in range(i,n):if s[i]==s[j] and (j-i<=2 or dp[i+1][j-1]):dp[i][j]=Trueif j-i+1>max_len:max_len=j-i+1begin=ireturn s[begin:begin+max_len]

912. 排序数组


题目链接

  1. 快速排序
class Solution:def sortArray(self, nums: List[int]) -> List[int]:self.quick(nums, 0, len(nums) - 1)return numsdef quick(self, nums, left, right):if left >= right:return nums# 选择一个随机的索引作为pivotpivot_index = random.randint(left, right)# 将随机选择的pivot和最左侧的元素交换nums[left], nums[pivot_index] = nums[pivot_index], nums[left]pivot = nums[left]left0, right0 = left, rightwhile left < right:while left < right and nums[right] >= pivot:right -= 1while left < right and nums[left] <= pivot:left += 1nums[left], nums[right] = nums[right], nums[left]# 恢复pivot到正确的位置nums[left0], nums[left] = nums[left], nums[left0]self.quick(nums, left + 1, right0)self.quick(nums, left0, left - 1)
  1. 归并排序
class Solution:# 合并两个有序数组def merge(self,left,right):merged=[]i=j=0while i<len(left) and j<len(right):if left[i]<=right[j]:merged.append(left[i])i+=1else:merged.append(right[j])j+=1while i<len(left):merged.append(left[i])i+=1while j<len(right):merged.append(right[j])j+=1return merged# 划分左右数组def sortArray(self, nums: List[int]) -> List[int]:if len(nums)<=1:return numsmid=len(nums)//2left=self.sortArray(nums[:mid])right=self.sortArray(nums[mid:])return self.merge(left,right)
  1. 堆排序
class Solution:def adjust(self,nums,parent,length):"""nums:待排序数组parent:父结点的索引length:参与调整的数组长度(结点个数)"""child=parent*2+1while child<length:if child+1<length and nums[child+1]>nums[child]:child+=1if nums[parent]<nums[child]:nums[parent],nums[child]=nums[child],nums[parent]parent=childchild=2*parent+1else:breakdef sortArray(self, nums: List[int]) -> List[int]:# 建立堆结构for i in range(len(nums)//2-1,-1,-1):self.adjust(nums,i,len(nums))for i in range(len(nums)-1,0,-1):nums[0],nums[i]=nums[i],nums[0]self.adjust(nums,0,i)return nums
  1. 冒泡排序
def bubble_sort(lis):n = len(lis)# 控制比较的轮数for j in range(n - 1):count = 0# 控制每一轮的比较次数# -1是为了让数组不要越界# -j是每一轮结束之后, 我们就会少比一个数字for i in range(n - 1 - j):if lis[i] > lis[i + 1]:lis[i], lis[i + 1] = lis[i + 1], lis[i]count += 1# 算法优化# 如果遍历一遍发现没有数字交换,退出循环,说明数列是有序的if count == 0:break

总结:

  • 快速排序、堆排序、归并排序的时间复杂度都是 O(nlogn);
  • 快速排序、堆排序是不稳定的,归并排序、冒泡排序是稳定的。

这篇关于2024.4.26——LeetCode 高频题复盘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940451

相关文章

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划