【力扣hot100】刷题笔记Day10

news2024/9/22 1:16:45

前言

  • 一鼓作气把链表给刷完!!中等题困难题冲冲冲啊啊啊!

25. K 个一组翻转链表 - 力扣(LeetCode)

  • 模拟

    • class Solution:
          def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
              # 翻转链表前k项
              def reverse(head, k):
                  pre, cur = None, head
                  while cur and k:
                      temp = cur.next
                      cur.next = pre
                      pre = cur
                      cur = temp
                      k -= 1
                  return pre, head  # pre为头,head为尾
              dummy = ListNode(0, head)
              pre = cur = dummy
              count = k  # 用于重复计数
              while cur.next and count:
                  count -= 1
                  cur = cur.next
                  if count == 0:
                      temp = cur.next  # 存一下段后节点
                      pre.next, cur = reverse(pre.next, k)  # 连接段前+翻转
                      cur.next = temp  # 连上段后节点
                      pre = cur  # 更新pre指针
                      count = k  # 恢复count继续遍历
              return dummy.next

 138. 随机链表的复制 - 力扣(LeetCode)

  • 路飞的题解真是太强啦!!优雅清晰简洁
  • 哈希表

    • """
      # Definition for a Node.
      class Node:
          def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
              self.val = int(x)
              self.next = next
              self.random = random
      """
      
      class Solution:
          def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':
              if not head: return None
              dic = {}
              # 1. 复制各节点,并建立 “原节点 -> 新节点” 的 Map 映射
              cur = head
              while cur:
                  dic[cur] = Node(cur.val)
                  cur = cur.next
              # 2. 构建新节点的 next 和 random 指向
              cur = head
              while cur:
                  dic[cur].next = dic.get(cur.next)
                  dic[cur].random = dic.get(cur.random)
                  cur = cur.next
              # 3. 返回新链表的头节点    
              return dic[head]
  • 拼接 + 拆分

    • class Solution:
          def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':
              if not head: return None
              dic = {}
              # 1. 复制各节点,并构建拼接链表
              cur = head
              while cur:
                  temp = Node(cur.val)
                  temp.next = cur.next
                  cur.next = temp
                  cur = temp.next
              # 2. 构建各新节点的 random 指向
              cur = head
              while cur:
                  if cur.random:
                      cur.next.random = cur.random.next
                  cur = cur.next.next
              # 3. 拆分两链表
              cur = newhead = head.next
              pre = head
              while cur.next:
                  pre.next = pre.next.next
                  cur.next = cur.next.next
                  pre = pre.next
                  cur = cur.next
              pre.next = None  # 单独处理原链表尾节点
              return newhead  # 返回新链表头节点

148. 排序链表 - 力扣(LeetCode)

  • 归并排序(顶到底递归)

    • 参考路飞题解
    • class Solution:
          def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
              if not head or not head.next: return head
              # 快慢指针分割链表
              slow, fast = head, head.next
              while fast and fast.next:
                  fast, slow = fast.next.next, slow.next
              mid = slow.next  # 右半部分的头节点
              slow.next = None  # 断开两部分
              # 递归进行归并排序
              left = self.sortList(head)
              right = self.sortList(mid)
              # 合并左右两个链表
              dummy = cur = ListNode(0)
              while left and right:  # 根据大小依次插入新链表
                  if left.val < right.val:
                      cur.next = left
                      left = left.next
                  else:
                      cur.next = right
                      right = right.next
                  cur = cur.next
              cur.next = left if left else right  # 接上剩下的
              return dummy.next
  • 归并排序(底到顶合并) 

    • class Solution:
          def sortList(self, head: ListNode) -> ListNode:
              # 合并两个有序链表
              def merge(head1, head2):
                  dummy = cur = ListNode(0)
                  while head1 and head2:
                      if head1.val < head2.val:
                          cur.next = head1
                          head1 = head1.next
                      else:
                          cur.next = head2
                          head2 = head2.next
                      cur = cur.next
                  cur.next = head1 if head1 else head2
                  return dummy.next
              # 如果只有一个节点直接返回head
              if not head: return head
              # 统计链表长度
              lenth = 0
              cur = head
              while cur:
                  cur = cur.next
                  lenth += 1
              # 开始循环合并
              dummy = ListNode(0, head)
              sublenth = 1
              while sublenth < lenth:
                  pre, cur = dummy, dummy.next
                  while cur:
                      head1 = cur
                      for i in range(1, sublenth):
                          if cur.next:
                              cur = cur.next
                          else:
                              break  # 如果还没找到head2说明不用合并,下一轮
                      head2 = cur.next
                      if not head2: break  # 空就不合并了
                      cur.next = None  # 断开第一段后
                      cur = head2
                      for i in range(1, sublenth):
                          if cur.next:
                              cur = cur.next
                          else:
                              break
                      temp = cur.next  
                      cur.next = None  # 断开第二段后
                      cur = temp
                      merged = merge(head1, head2)  # 合并
                      pre.next = merged
                      while pre.next:
                          pre = pre.next  # pre更新到合并后链表的最后
                      pre.next = temp  # 重新连接第二段后
                  # 下一轮合并
                  sublenth *= 2
              return dummy.next

 23. 合并 K 个升序链表 - 力扣(LeetCode)

  • 依次合并

    • class Solution:
          def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
              # 合并两个有序链表
              def merge(head1, head2):
                  dummy = cur = ListNode(0)
                  while head1 and head2:
                      if head1.val < head2.val:
                          cur.next = head1
                          head1 = head1.next
                      else:
                          cur.next = head2
                          head2 = head2.next
                      cur = cur.next
                  cur.next = head1 if head1 else head2
                  return dummy.next
              lenth = len(lists)
              if lenth == 0:
                  return None
              # 每遍历一个链表就合并掉
              dummyhead = ListNode(0)
              for i in range(0, len(lists)):
                  dummyhead.next = merge(dummyhead.next, lists[i])
              return dummyhead.next
  •  分治合并

    • class Solution:
          def mergeKLists(self, lists: List[ListNode]) -> ListNode:
              # 如果输入为空,直接返回空
              if not lists:
                  return 
              # 获取链表列表的长度
              n = len(lists)
              # 调用递归函数进行合并
              return self.merge(lists, 0, n-1)
          
          def merge(self, lists, left, right):
              # 当左右指针相等时,表示只有一个链表,直接返回该链表
              if left == right:
                  return lists[left]
              # 计算中间位置
              mid = left + (right - left) // 2
              # 递归地合并左半部分和右半部分的链表
              l1 = self.merge(lists, left, mid)
              l2 = self.merge(lists, mid+1, right)
              # 调用合并两个有序链表的函数
              return self.mergeTwoLists(l1, l2)
          
          def mergeTwoLists(self, l1, l2):
              # 若其中一个链表为空,则直接返回另一个链表
              if not l1:
                  return l2
              if not l2:
                  return l1
              # 比较两个链表头结点的大小,选择较小的作为新链表的头结点
              if l1.val < l2.val:
                  l1.next = self.mergeTwoLists(l1.next, l2)
                  return l1
              else:
                  l2.next = self.mergeTwoLists(l1, l2.next)
                  return l2
  •  最小堆

    • """
      假设有3个有序链表分别是:1->4->5, 1->3->4, 2->6。
      初始时,最小堆为空。我们依次将(1,0),(1,1),(2,2)加入最小堆。
      然后不断弹出最小值(1,0),(1,1),(2,2),加入到结果链表中,
      并将对应链表的下一个节点值和索引加入最小堆,直到最小堆为空。
      最终得到的合并后的链表为1->1->2->3->4->4->5->6
      """
      class Solution:
          def mergeKLists(self, lists: List[ListNode]) -> ListNode:
              import heapq
              # 创建虚拟节点
              dummy = ListNode(0)
              p = dummy
              head = []
              # 遍历链表数组
              for i in range(len(lists)):
                  if lists[i] :
                      # 将每个链表的头结点值和索引加入到最小堆中
                      heapq.heappush(head, (lists[i].val, i))
                      lists[i] = lists[i].next
              while head:
                  # 弹出最小堆中的值和对应的索引
                  val, idx = heapq.heappop(head)
                  # 创建新节点并连接到结果链表上
                  p.next = ListNode(val)
                  p = p.next
                  # 如果该链表还有剩余节点,则将下一个节点的值和索引加入到最小堆中
                  if lists[idx]:
                      heapq.heappush(head, (lists[idx].val, idx))
                      lists[idx] = lists[idx].next
              # 返回合并后的链表
              return dummy.next

146. LRU 缓存 - 力扣(LeetCode)

  • 哈希 + 双向链表

    • 借用灵神题解的图,really good
    • class Node:
          # 提高访问属性的速度,并节省内存
          __slots__ = 'prev', 'next', 'key', 'value'
          def __init__(self, key=0, value=0):
              # self.prev = None
              # self.next = None
              self.key = key
              self.value = value
      
      class LRUCache:
          def __init__(self, capacity: int):
              self.capacity = capacity
              self.dummy = Node()  # 哨兵节点
              self.dummy.prev = self.dummy
              self.dummy.next = self.dummy
              self.key_to_node = dict()
      
          def get_node(self, key: int) -> Optional[Node]:
              if key not in self.key_to_node:  # 没有这本书
                  return None
              node = self.key_to_node[key]  # 有这本书
              self.remove(node)  # 把这本书抽出来
              self.push_front(node)  # 放在最上面
              return node
      
          def get(self, key: int) -> int:
              node = self.get_node(key)
              return node.value if node else -1
      
          def put(self, key: int, value: int) -> None:
              node = self.get_node(key)
              if node:  # 有这本书
                  node.value = value  # 更新 value
                  return
              self.key_to_node[key] = node = Node(key, value)  # 新书
              self.push_front(node)  # 放在最上面
              if len(self.key_to_node) > self.capacity:  # 书太多了
                  back_node = self.dummy.prev
                  del self.key_to_node[back_node.key]
                  self.remove(back_node)  # 去掉最后一本书
      
          # 删除一个节点(抽出一本书)
          def remove(self, x: Node) -> None:
              x.prev.next = x.next
              x.next.prev = x.prev
      
          # 在链表头添加一个节点(把一本书放在最上面)
          def push_front(self, x: Node) -> None:
              x.prev = self.dummy
              x.next = self.dummy.next
              x.prev.next = x
              x.next.prev = x
      
      # Your LRUCache object will be instantiated and called as such:
      # obj = LRUCache(capacity)
      # param_1 = obj.get(key)
      # obj.put(key,value)

后言

  • 链表终于结束了!后面这几道真是难到我了,基本都是CV写出来的,还是得多沉淀啊 !休息一下,晚上干点活了,不然新学期要被老板骂骂

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA)

跨越千年医学对话&#xff1a;用AI技术解锁中医古籍知识&#xff0c;构建能够精准问答的智能语言模型&#xff0c;成就专业级古籍解读助手&#xff08;LLAMA&#xff09; 介绍&#xff1a;首先在 Ziya-LLaMA-13B-V1基线模型的基础上加入中医教材、中医各类网站数据等语料库&am…

day16_ListSet课后练习题 - 参考答案

文章目录 day16_课后练习题第1题第2题第3题第4题第5题第6题第7题第8题 day16_课后练习题 第1题 案例&#xff1a; ​ 1、用一个String[]数组存点数 ​ 2、用一个String[]数组存花色 ​ 3、用一个String[]数组存大王、小王 ​ 4、用上面的数组&#xff0c;生成一副扑克牌 …

【寸铁的刷题笔记】树、dfs、bfs、回溯、递归(一)

【寸铁的刷题笔记】树、dfs、bfs、回溯、递归(一) 大家好 我是寸铁&#x1f44a; 总结了一篇刷题关于树、dfs、bfs、回溯、递归的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 105. 从前序与中序遍历序列构造二叉树 模拟分析图 代码实现 /*** Definition for a binary tre…

Android中Transition过渡动画的简单使用

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、布局xml文件代码如下&#xff1a; <?xml version"1.0" encoding&quo…

websocket与Socket的区别

概念讲解 网络&#xff1a;通俗意义上&#xff0c;也就是连接两台计算器 五层网络模型&#xff1a;应用层、传输层、网络层、数据链路层、物理层 应用层 (application layer)&#xff1a;直接为应用进程提供服务。应用层协议定义的是应用进程间通讯和交互的规则&#xff0c;不…

【结合OpenAI官方文档】解决Chatgpt的API接口请求速率限制

OpenAI API接口请求速率限制 速率限制以五种方式衡量&#xff1a;RPM&#xff08;每分钟请求数&#xff09;、RPD&#xff08;每天请求数&#xff09;、TPM&#xff08;每分钟令牌数&#xff09;、TPD&#xff08;每天令牌数&#xff09;和IPM&#xff08;每分钟图像数&#x…

网页403错误(Spring Security报异常 Encoded password does not look like BCrypt)

这个错误通常表现为"403 Forbidden"或"HTTP Status 403"&#xff0c;它指的是访问资源被服务器理解但拒绝授权。换句话说&#xff0c;服务器可以理解你请求看到的页面&#xff0c;但它拒绝给你权限。 也就是说很可能测试给定的参数有问题&#xff0c;后端…

【rust】vscode下rust-analyzer和Rust Test Lens的Lens

背景 一个粉丝问&#xff1a; 我编辑的launch.json为什么只在按F5的时候工作 按这个debug按钮就不工作&#xff1f; 那在哪改这个插件的配置文档&#xff1f;我一直用的F5 今天上午才注意到这个问题&#xff0c;比如怎么改程序的命令行参数&#xff0c;我意思是如果我非要用…

如何使用逻辑回归处理多标签问题?

逻辑回归处理多分类 1、背景描述2、One vs One 1、背景描述 逻辑回归本身只能用于二分类问题&#xff0c;如果实际情况是多分类的&#xff0c;那么就需要对模型进行一些改动。下面介绍三种常用的将逻辑回归用于多分类的方法 2、One vs One OvO&#xff08;One vs One&#xff…

【嵌入式学习】QT-Day3-Qt基础

1> 思维导图 https://lingjun.life/wiki/EmbeddedNote/20QT 2> 完善登录界面 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后…

igolang学习3,golang 项目中配置gin的web框架

1.go 初始化 mod文件 go mod init gin-ranking 2.gin的crm框架 go get -u github.com/gin-gonic/gin 3.go.mod爆红解决

C2-1.4(L1,L2)正则化

C2-1.4&#xff08;L1,L2&#xff09;正则化 参考书籍 1 正则化的概念 正则化(Regularization) 是机器学习中对原始损失函数引入额外信息&#xff0c;以便防止过拟合和提高模型泛化性能的一类方法的统称。也就是目标函数变成了原始损失函数额外项&#xff0c;常用的额外项一般…

Oladance、南卡、韶音开放式耳机怎么样?3个月真实对比测评

​哪款开放式耳机好用&#xff1f;我亲自体验并评测了市场上流行的三个品牌的开放式耳机&#xff1a;Oladance、南卡、韶音。通过深入测试多维度性能表现&#xff0c;确保你能够远离劣质产品可能带来的问题。我想提醒大家&#xff0c;如果选错耳机可能会影响到音乐的真实还原和…

【高德地图】Android搭建3D高德地图详细教

&#x1f4d6;Android搭建3D高德地图详细教程 &#x1f4d6;第1章 高德地图介绍✅了解高德地图✅2D地图与3D地图 &#x1f4d6;第2章 搭建3D地图并显示✅第 1 步&#xff1a;创建 Android 项目✅第 2 步&#xff1a;获取高德Key✅第 3 步&#xff1a;下载地图SDK✅第 4 步&…

2023 龙蜥操作系统大会演讲实录:《兼容龙蜥的云原生大模型数据计算系统——πDataCS》

本文主要分三部分内容&#xff1a;第一部分介绍拓数派公司&#xff0c;第二部分介绍 πDataCS 产品&#xff0c;最后介绍 πDataCS 与龙蜥在生态上的合作。 杭州拓数派科技发展有限公司&#xff08;简称“拓数派”&#xff0c;英文名称“OpenPie”&#xff09;是国内基础数据计…

Android platform tool中d8.bat不生效

d8.bat因找不到java_exe文件&#xff0c;触发EOF d8.bat中之前代码为&#xff1a; set java_exe if exist "%~dp0..\tools\lib\find_java.bat" call "%~dp0..\tools\lib\find_java.bat" if exist "%~dp0..\..\tools\lib\find_java.bat" …

【教3妹学编程-算法题】匹配模式数组的子数组数目 II

3妹&#xff1a;2哥2哥&#xff0c;你有没有看到上海女老师出轨男学生的瓜啊。 2哥 : 看到 了&#xff0c;真的是太毁三观了&#xff01; 3妹&#xff1a;是啊&#xff0c; 老师本是教书育人的职业&#xff0c;明确规定不能和学生谈恋爱啊&#xff0c;更何况是出轨。 2哥 : 是啊…

petalinux_zynq7 驱动DAC以及ADC模块之一:建立IP

0. 环境 - ubuntu18 - vivado 2018.3 - mizar z7010 ada106模块 1. vivado 1.1 创建vivado工程 运行vivado source /tools/Xilinx/Vivado/2018.3/settings64.sh vivado& 创建vivado工程 Vivado -> Create Project -> Next -> -> Project name: …

【论文阅读笔记】Revisiting RCAN: Improved Training for Image Super-Resolution

论文地址&#xff1a;https://arxiv.org/abs/2201.11279 代码地址&#xff1a;https://github.com/zudi-lin/rcan-it 论文小结 本文的工作&#xff0c;就是重新审视之前的RCAN&#xff0c;然后做实验来规范化SR任务的训练流程。 此外&#xff0c;作者得出一个结论&#xff1a;…

Vue单文件学习项目综合案例Demo,黑马vue教程

文章目录 前言一、小黑记事本二、购物车三、小黑记账清单 前言 bilibili视频地址 一、小黑记事本 效果图 主代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible&…