当前位置: 首页 > news >正文

LeetCode 100 -- Day2

1. 链表:160、206、234、21

(1)160 相交链表

class Solution(object):def getIntersectionNode(self, headA, headB):if not headA or not headB:return Nonelen1,len2 = 0,0a,b = headA,headBwhile a:a=a.nextlen1+=1while b:b=b.nextlen2+=1a,b = headA,headBif len1>=len2:for _ in range(len1-len2):a=a.nextelse:for _ in range(len2-len1):b=b.nextwhile a!=b:a=a.nextb=b.nextreturn a

优化方案:

        p = headAq = headBwhile p!=q:p=p.next if p else headBq=q.next if q else headAreturn p

(2)206 反转链表

class Solution(object):def reverseList(self, head):if not head:returnstack=[]p=headwhile p:stack.append(p)       p=p.next""" 栈顶元素是新的头节点 """head=stack.pop()    p=headwhile stack:p.next=stack.pop()p=p.next""" 尾节点的next置空 """p.next=None     return head

迭代法:

        pre=Nonep=headwhile p:q=p.nextp.next=prepre=pp=qreturn pre

(3)234 回文链表

快慢指针寻找中点 + 反转后半部分链表

class Solution(object):def isPalindrome(self, head):""" 找到链表中点 """slow,fast = head,headwhile fast and fast.next:slow=slow.nextfast=fast.next.next""" 反转后半段链表 """reversed_head=Nonewhile slow:q=slow.nextslow.next=reversed_headreversed_head=slowslow=qwhile reversed_head:if head.val!=reversed_head.val:return Falsereversed_head=reversed_head.nexthead=head.nextreturn True

(4)21 合并有序链表

创建一个哨兵节点(dummy node),它的next指向合并后链表的头节点

class Solution(object):def mergeTwoLists(self, list1, list2):dummy=ListNode(0)p=dummywhile list1 and list2:if list1.val<=list2.val:p.next=list1list1=list1.nextelse:p.next=list2list2=list2.nextp=p.nextif list1:   p.next=list1if list2:   p.next=list2return dummy.next

2. 图:200、994

(1)200 岛屿数量

from collections import deque
class Solution(object):def numIslands(self, grid):m,n = len(grid),len(grid[0])directions=[(0,1),(0,-1),(1,0),(-1,0)]island=0for i in range(m):for j in range(n):## 是未发现的新陆地if grid[i][j]=='1': island+=1## 找当前陆地连接的其他陆地(整个连通分量)quene=deque()quene.append((i,j))grid[i][j]='0'  ## 当前陆地已访问 → 变成水while quene:row,col = quene.popleft()for dr,dc in directions:next_row, next_col = row+dr, col+dc""" 上下左右四个方向如果是符合范围的陆地:## 1.标记已访问(不是新的岛屿,只是加入当前岛屿的陆地)## 2.入队(继续找连通分量)"""if 0<=next_row<m and 0<=next_col<n and grid[next_row][next_col]=='1':grid[next_row][next_col]='0'quene.append((next_row,next_col))return island

(2)994 腐烂的橘子

from collections import deque
class Solution(object):def orangesRotting(self, grid):time=-1fresh=0quene=deque()m,n = len(grid),len(grid[0])directions=[(0,1),(0,-1),(1,0),(-1,0)]for i in range(m):for j in range(n):if grid[i][j]==1:fresh+=1elif grid[i][j]==2:quene.append((i,j))if fresh==0:    return 0while quene:for _ in range(len(quene)):cur_row,cur_col = quene.popleft()for dr,dc in directions:next_row,next_col = cur_row+dr,cur_col+dcif 0<=next_row<m and 0<=next_col<n and grid[next_row][next_col]==1:fresh-=1grid[next_row][next_col]=2quene.append((next_row,next_col))time+=1return time if fresh==0 else -1

3. 贪心算法:55、45

(1)55 跳跃游戏

class Solution(object):def canJump(self, nums):max_reach=0for i,num in enumerate(nums):""" max_reach无法支撑走到位置i → 直接失败 """if i>max_reach: return False""" 如果当前位置跳跃达到的最远位置比当前max_reach远 → 更新max_reach """max_reach=max(max_reach, i+num)if max_reach>=len(nums)-1:return Truereturn True

(2)55 跳跃游戏②

class Solution(object):def jump(self, nums):n=len(nums)step=0cur_end=0max_reach=0for i in range(n-1):max_reach = max(max_reach, i+nums[i])""" 当前位置到达目前最远处的边界:1.必须要往前跳step++2.最远边界更新为当前位置能到达的最远处max_reach """if i==cur_end:step+=1cur_end=max_reach""" 当前最远边界已超过给定位置(n-1),说明跳到现在就已经ok了 """if cur_end>=n-1:breakreturn step

贪心vs动规的一点心得:

(1)贪心:现在 → 未来,做出当前最优选择,不考虑后续的影响

def greedy():sort()                    # 通常需要先排序current = initial_state   # 当前状态for item in items:        # 单次遍历if can_make_decision(current, item):current = make_decision(current, item)  # 做出局部最优决策return current

(2)动规:未来 → 现在,通过目标反推当前,定义状态转移方程

def dp():memo = [0]*n               # 状态存储(记忆化)dp[0] = base_case          # 基础状态for i in range(1, n):for j in range(i):       # 考虑所有可能的前驱状态# 状态转移方程(核心)dp[i] = max/min(dp[i], dp[j] + transition_cost)  return dp[n-1]             # 返回最终状态
http://www.xdnf.cn/news/1327627.html

相关文章:

  • JVM垃圾收集器
  • ts 引入类型 type 可以省略吗
  • sfc_os!SfcValidateDLL函数分析之cache文件版本
  • python的社区互助养老系统
  • 【实时Linux实战系列】实时平台下的图像识别技术
  • 微软AD国产化替换倒计时——不是选择题,而是生存题
  • 初识线段树
  • 电影购票+票房预测系统 - 后端项目介绍(附源码)
  • 114. 二叉树展开为链表
  • 华为云之开发者空间云主机使用体验【玩转华为云】
  • RH134 运行容器知识点
  • 【QT入门到晋级】进程间通信(IPC)-socket(包含性能优化案例)
  • 面试题储备-MQ篇 3-说说你对Kafka的理解
  • 如何使用DeepSeek解析长pdf的文本
  • 需求开发广告系列 Gmail广告投放教程
  • 跨域信息结构:四界统一的动态机制
  • 大模型 + 垂直场景:搜索/推荐/营销/客服领域开发新范式与技术实践
  • 机器学习概念(面试题库)
  • 智慧校园中IPTV融合对讲:构建高效沟通新生态
  • [激光原理与应用-305]:光学设计 - 单个光学元件(纯粹的光学元件)的设计图纸的主要内容、格式与示例
  • 北京国标调查:以科学民意调查赋能决策,架起沟通与信任的桥梁(满意度调查)
  • PicoShare 文件共享教程:cpolar 内网穿透服务实现跨设备极速传输
  • 数控滑台的功能与应用范围
  • 如何用给各种IDE配置R语言环境
  • 大数据云原生是什么
  • 如何计算 PCM 音频与 YUV/RGB 原始视频文件大小?
  • 【AI】算法环境-显卡、GPU、Cuda、NVCC和cuDNN的区别与联系
  • JVM垃圾回收(GC)深度解析:原理、调优与问题排查
  • 牛津大学xDeepMind 自然语言处理(2)
  • kkfileview预览Excel文件去掉左上角的跳转HTM预览、打印按钮