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);
  • 快速排序、堆排序是不稳定的,归并排序、冒泡排序是稳定的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/652512.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《红玫瑰与白玫瑰》读后感

张爱玲的小说《红玫瑰与白玫瑰》是在床上睡眼惺忪的状态下开始看的&#xff0c;越看越精神&#xff0c;最后竟几乎到了彻夜难眠的地步。小说不长&#xff0c;对男女感情的把握却妙到毫巅&#xff0c;令人击节赞叹。就着陈奕迅同曲异词的两首歌------《红玫瑰》《白玫瑰》&#…

基于FastGPT搭建知识库问答系统

什么是 FastGPT &#xff1f; FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; FastGPT 允许用户构建本地知识库&#xff0c;…

备考2024年小学生古诗文大会:做做10道历年真题和知识点(持续)

根据往年的安排&#xff0c;2024年上海市小学生古诗文大会预计还有一个月就将启动。我们继续来随机看10道往年的上海小学生古诗文大会真题&#xff0c;这些题目来自我去重、合并后的1700在线题库&#xff0c;每道题我都提供了参考答案和独家解析。 根据往期的经验&#xff0c;只…

Vue入门篇:生命周期,钩子函数,工程化开发Vue(脚手架安装),组件化开发(全局注册,局部注册)

目录 1.Vue生命周期和生命周期的四个阶段2.Vue生命周期函数&#xff08;钩子函数)3.工程化开发&脚手架Vue CLI1.在powershell管理员权限下打开命令行安装脚手架&#xff1a;2.查看vue版本&#xff1a;3.创建项目架子4.运行项目 4.组件化开发&根组件1.App.vue文件&#…

「Kafka」Kafka单机和集群安装(二)

「Kafka」Kafka单机和集群安装&#xff08;二&#xff09; 一、单机启动1. 下载安装Kafka2. 启动ZooKeeper2. 启动Kafka 二 、集群启动1. 安装zookeeper2. 安装kakfa3. 封装启动脚本 一、单机启动 1. 下载安装Kafka 阿里云下载地址&#xff1a;Kafka阿里云镜像站&#xff0c;官…

AI大模型探索之路-训练篇5:大语言模型预训练数据准备-词元化

系列文章目录&#x1f6a9; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据…

全面解析平台工程与 DevOps 的区别与联系

平台工程的概念非常流行&#xff0c;但很多开发人员仍然不清楚它是如何实际运作的&#xff0c;这是非常正常的。 平台工程是与 DevOps 并行吗&#xff1f;还是可以相互替代&#xff1f;或者 DevOps 和平台工程是两个完全不同的概念&#xff1f; 一种比较容易将两者区分开来的方…

mysql中join内外连接查询例子

文章目录 join关键字概要举例using 与 on 区别 join关键字 在MySQL中&#xff0c;JOIN 是一种用于将两个或多个表中的行联合起来的操作。 连接&#xff08;join&#xff09;就是将一张表中的行按照某个条件&#xff08;连接条件&#xff09;与另一张表中的行连接起来形成一个新…

泰坦尼克号乘客生存情况预测分析2

泰坦尼克号乘客生存情况预测分析1 泰坦尼克号乘客生存情况预测分析2 泰坦尼克号乘客生存情况预测分析3 泰坦尼克号乘客生存情况预测分析总 背景描述 Titanic数据集在数据分析领域是十分经典的数据集&#xff0c;非常适合刚入门的小伙伴进行学习&#xff01; 泰坦尼克号轮船的…

react 基础学习笔记一

1、jsx语法过程 jsx使用react构造组件&#xff0c;通过bable进行编译成js对象&#xff0c;在用ReactDom.render()渲染成DOM元素&#xff0c;最后再插入页面的过程。 2、创建组件 组件的定义&#xff1a;将公用的代码组装成一个独立的文件&#xff0c;保持代码独立性&#xff0…

如何将图片压缩100k?几个方法帮你解决

很多平台为了保证用户体验&#xff0c;会限制我们上传图片的大小&#xff0c;所以我们在社交平台分享图片的时候&#xff0c;就会看有些要求为100kb的字样&#xff0c;那么我们怎么把一些过大的图片压缩100kb大小呢&#xff1f;试试下面介绍的这几个方法吧。 在工具栏中选择【…

每天五分钟深度学习:如何理解梯度下降算法可以逼近全局最小值?

本文重点 上节课程中,我们已经知道了逻辑回归的代价函数J。要想最小化代价函数,我们需要使用梯度下降算法。 梯度下降算法地直观理解: 为了可视化,我们假设w和b都是单一实数,实际上,w可以是更高地维度。 代价函数J是在水平轴w和b上的曲面,因此曲面的高度就是J(w,b)在…