北大硕士LeetCode算法专题课--动态规划和贪心算法

news2024/11/20 23:27:30

面试专题课:

北大硕士LeetCode算法专题课--递归和回溯_骨灰级收藏家的博客-CSDN博客

北大硕士LeetCode算法专题课-栈、队列相关问题_骨灰级收藏家的博客-CSDN博客 

北大硕士LeetCode算法专题课--链表相关问题_骨灰级收藏家的博客-CSDN博客 

北大硕士LeetCode算法专题课-查找相关问题_骨灰级收藏家的博客-CSDN博客 

北大硕士LeetCode算法专题课-字符串相关问题_骨灰级收藏家的博客-CSDN博客

北大硕士LeetCode算法专题课-数组相关问题_骨灰级收藏家的博客-CSDN博客 

北大硕士LeetCode算法专题课-基础算法查找_骨灰级收藏家的博客-CSDN博客 

北大硕士LeetCode算法专题课-基础算法之排序_骨灰级收藏家的博客-CSDN博客 

北大硕士LeetCode算法专题课---算法复杂度介绍_骨灰级收藏家的博客-CSDN博客 

什么是动态规

我们以斐波那契数列为例来说明什么是动态规划

斐波那契数列(Fibonacci sequence: F(0)=0F(1)=1, F(n)=F(n - 1)+F(n - 2)

import time
def fib(n):
if n == 0:
return 0
if n == 1:
return 1
return fib(n - 1) + fib(n - 2)

if  		name 	 == ' 	main 	':  t1 = time.time()
n = fib(10)
t2 = time.time()
print("n = %d, 用时%d 毫秒" % (n, (t2 - t1) * 1000))

 

 

 

 

斐波那契数列,优化: 记忆化搜索

def fib2(n):
global num  num += 1  if n == 0:
return 0
if n == 1:
return 1
if res[n] == -1:
res[n] = fib2(n - 1) + fib2(n - 2)
return res[n]
if 	name	== ' 	main 	':
res = [-1 for i in range(41)]  t1 = time.time()
n = fib2(40)
t2 = time.time()
print("n = %d, 用时%d 毫秒,执行了%d次" % (n, (t2 - t1) * 1000, num))

 记忆化搜索:自上向下的解决问题

def fib2(n):
global num  num += 1  if n == 0:
return 0
if n == 1:
return 1
if res[n] == -1:
res[n] = fib2(n - 1) + fib2(n - 2)
return res[n]

动态规划:把大问题拆分成小问题,通过寻找大问题与小问题的递推关系,解决一个个小问题,在解决小问题的时候,  记忆每一个小问题的答案,使得每个小问题只解决一次,最终达到解决原问题的效果。

爬楼梯 (LeetCode 70)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 

每次你可以爬 1 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?提示:1 <= n <= 45

解题思路:假设f(n) 表示爬 n 阶楼梯可能的走法。

自顶向下的思路: 假设当前站在第n阶楼梯上,那么上一步可能在第n-1 或者 n-2 , 分别需要爬1级台阶和2级台阶 所以 f(n) = f(n-1) + f(n-2)

代码实现1 暴力搜索 上面式子中 n-2>=0 所以 最后一次递归调用为 f(2) = f(1) + f(0),边界就是 f(1) = 1f(0) = 1

def climbStairs(n):
if n == 0 or n == 1:
return 1
return climbStairs(n - 1) + climbStairs(n - 2)

 代码实现2 记忆化搜索

def climbStairs2(n):  def dfs(i, memo):
if i == 0 or i == 1:
return 1
if memo[i] == -1:
memo[i] = dfs(i - 1, memo) + dfs(i - 2, memo)
return memo[i]

return dfs(n, [-1] * (n + 1))

 代码实现3 动态规划

def climbStairs3(n):  res = [0] * (n + 1)  res[0] = res[1] = 1
for i in range(2, n + 1):
res[i] = res[i - 1] + res[i - 2]
return res[-1]

整数拆分 (LeetCode 343)

假设给定一个正整数 n ,将其拆分为 k 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 2 <= n <= 58

 

 

 

def integerBreak(n):  def dfs(n, memo):
if n ==1:
return 1
if memo[n] !=-1:  return memo[n]
res = -1
for i in range(1,n):
res = max(res,i*(n-i),i*dfs(n-i,memo))  memo[n] = res
return res
return dfs(n,[-1] * (n + 1))
def integerBreak(n):  dp = [0] * (n + 1)
for i in range(2, n + 1):
for j in range(i):
dp[i] = max(dp[i], j * (i - j), j * dp[i - j])
return dp[n]

打家劫 (LeetCode 198)

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是 相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

先考虑最简单的情况。如只有一间房屋,则偷窃该房屋,可以偷到最高总金额。如只有两间房屋,则由于两间房屋相邻,  不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。

如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?

对于第 k (k>2) 间房屋,有两个选项:

偷窃第 k 间房屋,那么就不能偷窃第 k-1 间房屋,偷窃总金额为前 k-2 间房屋的最高总金额与第 k 间房屋的金额之和。

不偷窃第 k 间房屋,偷窃总金额为前 k-1 间房屋的最高总金额。

在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 k 间房屋能偷窃到的最高总金额。 用 dp[i] 表示前 i 间房屋能偷窃到的最高总金额,那么就有如下的状态转移方程:

def rob(nums):  if not nums:
return 0

size = len(nums)
if size == 1:
return nums[0]

dp = [0] * size  dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
for i in range(2, size):
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])

return dp[size - 1]

 发饼干 (LeetCode 455)

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。 如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。

你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择,就能得到问题的答案。贪心 算法需要充分挖掘题目中条件,没有固定的模式,解决有贪心算法需要一定的直觉和经验。

为了尽可能满足最多数量的孩子,从贪心的角度考虑,应该按照孩子的胃口从小到大的顺序依次满足每个孩子,且 对于每个孩子,应该选择可以满足这个孩子的胃口且尺寸最小的饼干。

首先对数组 g s 排序,然后从小到大遍历 g 中的每个元素,对于每个元素找到能满足该元素的 s 中的最小的元素。 具体而言,令 i g 的下标,j s 的下标,初始时 i j 都为 0,进行如下操作。

对于每个元素 g[i],找到未被使用的最小的 j 使得 g[i]≤s[j],则 s[j] 可以满足 g[i]。由于 g s 已经排好序,因此整个过 程只需要对数组 g s 各遍历一次。当两个数组之一遍历结束时,说明所有的孩子都被分配到了饼干,或者所有的 饼干都已经被分配或被尝试分配(可能有些饼干无法分配给任何孩子),此时被分配到饼干的孩子数量即为可以满 足的最多数量。

def findContentChildren(g, s):  g.sort()
s.sort()
n, m = len(g), len(s)  i = j = count = 0

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

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

相关文章

<Python的函数(2)>——《Python》

目录 1.函数执行过程 2.链式调用 3.嵌套调用 4.函数递归 4.1 递归的概念 4.2 递归的优点 4.3 递归的缺点 5. 参数默认值 6. 关键字参数 7. 小结 1.函数执行过程 调用函数才会执行函数体代码. 不调用则不会执行. 函数体执行结束(或者遇到 return 语句), 则回到函数调…

清晰解析浮点型在内存中的存储 浮点型如何取出 IEEE754 SME 精度丢失 C语言进阶

&#x1f40e;作者的话 本文涵盖了浮点型在内存中的如何存储、如何取出、为何有精度丢失等知识点~ 跳跃式目录浮点型概括浮点数的存储bit位储存模型精度丢失浮点型的取出浮点数的取出实机演示浮点型概括 常见的浮点型数据有三种&#xff1a; 以科学计数法表示的&#xff1a;1…

php内核分析-fpm和df的问题思考

介绍 php中的disable_function是EG(ini_directives)来获得的&#xff0c;而phpinfo根据 EG(ini_directives) 中获取信息并打印。 然后通过zend_disable_function()函数去禁止&#xff0c;简单的说就是通过 func->handler ZEND_FN(display_disabled_function); 修改了handl…

ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-2-02:芯科的软件解决方案Gecko SDK

【源码、文档、软件、硬件、技术交流、技术支持&#xff0c;入口见文末】 【所有相关IDE、SDK和例程源码均可从群文件免费获取&#xff0c;免安装&#xff0c;解压即用】 持续更新中&#xff0c;欢迎关注&#xff01; 虽然Silicon Labs是一家半导体公司&#xff0c;但是他们为…

手写spring13(xml自动扫描bean注册)

文章目录目标包扫描注解配置的使用占位符属性的填充设计类结构一、实现1、处理占位符配置——PropertyPlaceholderConfigurer2、定义Scope、Component拦截注解3、处理对象扫描装配——ClassPathBeanDefinitionScanner4、解析xml中调用扫描二、测试1、准备2、属性配置文件3、pri…

网络原理笔记一

文章目录1、局域网&#xff08;LAN&#xff09;2、广域网&#xff08;WAN&#xff09;3、网络通信基础1、IP地址2、端口号3、认识协议4、协议分层1、网络模型2、网络数据传输的基本流程1、局域网&#xff08;LAN&#xff09; 局域网全称&#xff1a;Local Area Network&#x…

【数据结构】顺序表深度剖析

目录 &#x1f6eb;前言&#x1f6eb;&#xff1a; &#x1f680;一、线性表概述&#x1f680;&#xff1a; &#x1f6f0;️二、顺序表&#x1f6f0;️&#xff1a; 1.概念及结构&#xff1a; 2.接口实现&#xff1a; ①.工程文件&#xff1a; ②.接口实现&#xff1a; ③.…

2023 铁人三项 CTF --- Misc wp

文章目录Misc一生壹世Misc手的必备技能套娃-1套娃-2套娃-3套娃-4套娃-5Misc 一生壹世 根据提示压缩包密码是谐音&#xff0c;所以猜测密码是1314&#xff0c;直接解压得到四个txt文件 然后用010分按照一生一世打开4个文件&#xff0c;发现每个文件的第一个字节拼起来是8950…

LeetCode题目笔记——1807. 替换字符串中的括号内容

文章目录题目描述题目难度——中等方法一&#xff1a;使用字典代码/Python代码/C总结题目描述 给你一个字符串 s &#xff0c;它包含一些括号对&#xff0c;每个括号中包含一个 非空 的键。 比方说&#xff0c;字符串 “(name)is(age)yearsold” 中&#xff0c;有 两个 括号对…

什么是聚宽量化?

聚宽量化交易其实是通过编程将策略写成计算机可识别的代码&#xff0c;具体说可以是以python这门编程语言将与券商那边的平台搭建&#xff0c;例如用聚宽的向导式策略生成器就能很快的将股票交易接口翻译出来的策略&#xff0c;以便将平时需要查询的融资账户的持仓情况来编写代…

区块链将传统的产业运行逻辑,改造成以个体为主导的运行逻辑

新的产业之所以被成为新产业&#xff0c;其中一个很重要的原因在于&#xff0c;它的底层运行逻辑&#xff0c;正在发生一场深刻而又彻底的改变。然而&#xff0c;如果深入分析这种能够给产业的内在运行逻辑产生重塑和改变的&#xff0c;依然在于区块链本身。从某种意义上来讲&a…

YOLOv8 深度详解!一文看懂,快速上手

YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本&#xff0c;目前支持图像分类、物体检测和实例分割任务&#xff0c;在还没有开源时就收到了用户的广泛关注。 考虑到 YOLOv8 的优异性能&#xff0c;MMYOLO 也在第一时间组织了复现&#xf…

一篇文章搞定字符串的旋转问题(数组旋转问题)!

目录 前言 一.如何实现字符串的旋转&#xff1f; 1.用冒泡的思想实现 2.分别逆序左右再整体逆序来实现 二.如何快速判断一个字符串是否为另外一个字符串旋转之后的字符串&#xff1f; 1.相关库函数的简略学习 2.利用库函数快速实现判断 总结 博客主页&#xff1a;张栩睿…

数据结构基础知识(一)

1 数据结构的基本概念和算法 考点 数据结构基本概念算法 1.1 数据结构的基本概念 数据 数据是指所有能输入到计算机中的描述客观事物的符号&#xff0c;包括文本、声音、 图像、符号等。 数据元素 数据元素十数据的基本单位&#xff0c;也称节点或记录。 数据项 数据项…

【数仓】FLink+CK

1.项目分层 ODS&#xff1a;原始数据&#xff0c;包含日志和业务数据DWD&#xff1a;根据数据对象为单位进行分流。比如订单、页面访问等。DIM&#xff1a;维度数据DWM&#xff1a;对于部分数据对象进行进一步加工&#xff0c;比如独立访问、跳出行为&#xff0c;也可以和维度…

谷粒商城项目笔记之高级篇(三)

目录1.9.22 提交订单的问题1)、订单号显示、应付金额回显2)、提交订单消息回显3&#xff09;、为了确保锁库存失败后&#xff0c;订单和订单项也能回滚&#xff0c;需要抛出异常1.9.23 创建库存上锁、解锁 业务交换机&队列1&#xff09;、流程梳理2&#xff09;、解锁库存实…

Vsftpd服务的部署及优化详解(图文)

目录 前言 实验环境 一、vsftpd的安装及启用 1、具体步骤 2、开启匿名用户访问功能并测试 二、vsftpd基本信息 三、匿名用户访问控制 四、本地用户访问控制 五、虚拟用户访问 1、建立虚拟用户访问 2、虚拟用户家目录的独立设定 3、用户配置独立 前言 vsftpd是“…

TapTap 算法平台的 Serverless 探索之路

分享人&#xff1a;陈欣昊&#xff0c;TapTap/IEM/AI平台负责人 摘要&#xff1a;本文主要介绍心动网络算法平台在Serverless上的实践。 《TapTap算法平台的 Serverless 探索之路》 Serverless 在构建应用上为我们节省了大量的运维与开发人力&#xff0c;在基本没投入基建人力…

(02)Cartographer源码无死角解析-(49) 2D点云扫描匹配→相关性暴力匹配1:SearchParameters

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

LeetCode分类刷题----链表篇

链表链表1.移除链表元素203.移除链表元素707.设计链表2.反转链表206.反转链表3.两两交换链表中的节点24.两两交换链表中的节点4.删除链表中的倒数第N个节点19.删除链表的倒数第N个节点5.链表相交07.链表相交6.环形链表141.环形链表142.环形链表II链表 1.移除链表元素 203.移除…