力扣每日练习(3.20)补

322. 零钱兑换

想象你有一堆不同面值的硬币,现在的任务是用这些硬币凑出一个指定的金额,比如说11元,而且要求用的硬币数量尽可能少。

  1. 准备工作:首先,我们做了一张表(叫dp),这张表记录了从0元到目标金额(比如11元)每一个金额所需要的最少硬币数量。刚开始,我们假设每个金额所需的硬币数量都是最多的,这就像是一个最坏的情况。

  2. 开始计算:然后,我们开始尝试用手头上的每一种硬币去更新这张表。对于每一种硬币,我们看它能帮助减少哪些金额所需的硬币数量。

    • 比如,如果我们有1元和2元的硬币,我们就从1元和2元开始,一直尝试到11元,看看加入这种硬币后能不能让所需硬币数量更少。
    • 每次当我们考虑加入一个新的硬币时,我们会查看:如果我现在用这个硬币,再加上剩下的金额所需要的最少硬币数(这个信息已经在表里了),是不是比目前记录的要少。如果是,就更新这个金额所需的最少硬币数。
  3. 结果判断:最后,我们看看表中记录的目标金额所需的硬币数量是否被更新过(如果没有被更新过,说明用这些硬币凑不出这个金额),如果能凑出来,就告诉你需要的最少硬币数是多少。

class Solution:def coinChange(self, coins: List[int], amount: int) -> int:# 初始化从0到目标金额的逐个列表dp = [amount+1 for _ in range(amount+1)]dp[0] = 0 # 金额0不要任何硬币# 遍历每个硬币for c in coins:# 遍历大于等于硬币面额的金额for i in range(c, amount+1):# 核心:更新当前金额的最少所需硬币数,求 只使用当前硬币的数量 和 使用一个当前硬币+差额所需的最小硬币数 的最小值dp[i] = min(dp[i], dp[i-c]+1)# 如果指定金额的硬币数没有被更新,说明没有组合能够满足return dp[-1] if dp[-1] != amount+1 else -1

dp[i] = min(dp[i], dp[i-c]+1) 这行代码是动态规划的核心。dp[i-c]+1表示如果你选择了面额为c的硬币,那么对于剩余的金额i-c,所需的最小硬币数就是dp[i-c],再加上你这次选择的这一枚硬币(也就是+1)。min(dp[i], dp[i-c]+1)的意思是,比较当前金额i所需最小硬币数的现有值(dp[i])和使用当前面额硬币新计算得到的值(dp[i-c]+1),取二者中的较小值作为新的最小硬币数。

78. 子集

以nums = [1, 2, 3]为例。想象一下,我们有一个空盒子(temp),我们可以决定是否要把一些数字放进去。我们的目标是找出所有可能的方式来填充这个盒子,也就是所有的子集。

开始时,我们的盒子是空的。这也是一个子集,所以我们先把它加到结果列表res中。现在,res = [[]]。
递归的魔法:我们用一个函数dfs来帮助我们决定每个数字是否放入盒子。
我们从第一个数字开始,看看我们可以把它放入盒子(即列表temp),然后我们继续看下一个数字。
每当我们考虑一个数字(比如1),我们会做两件事:一次尝试把它加入盒子,另一次则不加。对于每种情况,我们都会继续向下看下一个数字,直到没有更多数字为止。
添加子集:每次我们到达数字列表的末尾时,我们的盒子里装的就是一个完整的子集。我们把这个子集的一个复制(使用list(temp)来确保我们复制的是内容,而不是引用)加到结果res中。
回溯:这个词听起来有点复杂,但实际上很简单。就是当我们考虑完一个数字(比如1)放入盒子后,我们会把它拿出来(temp.pop()),就好像我们从未做过这个决定一样。这样我们就可以回到之前的状态,然后考虑不放入1的情况。这个过程让我们能够探索所有可能的组合。
结束:当我们考虑完所有的数字后,res就包含了所有可能的子集。

class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res = []def dfs(temp, index, nums):# 直接添加当前子集到结果列表中,无需等到最后res.append(list(temp))  # 使用list(temp)来复制当前子集# 遍历从当前索引到末尾的所有元素for i in range(index, len(nums)):# 包含当前元素temp.append(nums[i])# 递归调用处理下一个元素dfs(temp, i + 1, nums)# 回溯:移除当前元素,尝试下一个选择temp.pop()# 开始递归dfs([], 0, nums)return(res)

221. 最大正方形

定义状态:我们可以定义一个二维的DP数组dp,其中dp[i][j]代表以(i, j)为右下角的最大正方形的边长。注意,这个定义是关键的,因为它让我们能够通过左边、上边和左上角的状态来决定当前位置的状态。
找到状态转移方程:对于每个位置(i, j),如果该位置的值是’1’,那么dp[i][j]应该是其左边、上边和左上角的dp值中的最小值加1。这是因为,一个位置如果要构成一个更大的正方形,它的左边、上边和左上角也必须能构成正方形。数学表达式为:dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1。
初始化:对于矩阵的第一行和第一列,dp[i][j]就直接是矩阵中的值(因为它们只能形成最大边长为1的正方形)。
遍历矩阵填充DP数组:从(1, 1)开始遍历整个矩阵,并根据状态转移方程更新DP数组。
找到最大的dp[i][j]:遍历DP数组,找到最大的值,这个值的平方即为最大正方形的面积。

创建了一个辅助矩阵,元素是int,这样就解决了对原始矩阵元素转换类型的问题,同时还有在原始矩阵里修改元素影响实际计算的问题。然后针对元素为’1’时才开始计算,同时考虑边界情况。状态转移方程是根据每一步前面的上、左、左上角的累计最小值+1决定当前1的边长,这样在本身自己是一个单位的基础上和上面的合起来就是2,依次累加

class Solution:def maximalSquare(self, matrix: List[List[str]]) -> int:# 长宽,初始化最大边长rows,cols = len(matrix), len(matrix[0])max_side = 0# 辅助矩阵,全0初始化dp = [[0]*cols for _ in range(rows)] # 遍历每个元素for r in range(rows):for c in range(cols):if matrix[r][c] != '0': # 为1才进行计算if r == 0 or c == 0: # 对于边界情况进行处理dp[r][c] = 1else: # 状态转移方程,假设当前是正方形的右下角,其值由左、上、左上的最小值决定dp[r][c] = min(dp[r][c-1], dp[r-1][c], dp[r-1][c-1]) + 1# 更新最大边长max_side = max(max_side, dp[r][c])# 边长2次方return max_side ** 2

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

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

相关文章

前端开发的第三方库

base64.js 地址:https://github.com/dankogai/js-base64 Base64.js 库提供了一个简单的 API,用于将数据转换为 Base64 编码,以及将 Base64 编码的数据解码回原始数据 Base64.js 是一个 JavaScript 库,用于将数据转换为 Base64 编…

LVGL:拓展部件——键盘 lv_keyboard

一、概述 此控件特点: 特殊Button矩阵:lv_keyboard 本质上是一个经过定制的按钮矩阵控件。每个按钮都可以独立触发事件或响应。预定义的键映射:lv_keyboard 自带了一套预设的按键布局和对应的字符映射表,开发者可以根据需要选择…

Vue 性能不给力?这些优化技巧帮你轻松搞定!

结合lighthouse查看各项数据,不断进行性能优化,可以从代码、项目打包、项目部署这三个层面来优化 代码层面 1、v-if和v-show区分使用 v-if(惰性的)用的条件判断,是惰性的,false的话初始不会渲染&#xf…

oracle迁移至gbase,sql问题总结(完善中)

最近再做国产化适配,需要把oracle里面的数据迁移至gbase 8a库中,这边把迁移过程中遇到的sql问题,记录下,现在仅迁移了一部分,后续会继续完善 1.ORACLE里面的NVL2函数在8a中不支持,可换成DECODE函数 2.表别…

二鼠打洞问题

文章目录 二鼠打洞问题测试说明Python求解 二鼠打洞问题 《九章算术》的“盈不足篇”里有一个很有意思的老鼠打洞问题。原文是这么说的:今有垣厚十尺,两鼠对穿。大鼠日一尺,小鼠亦一尺。大鼠日自倍,小鼠日自半。问:何…

此站点正在尝试打开 ,chrome/edge 允许http网站打开url schema

正常https链接会有首次允许选项 但http没有,每次都会弹出,非常烦人。 Chrome / Edge 配置 地址栏输入 chrome://flags/搜索Insecure origins treated as secure, 配置允许网站,需要协议和端口再次跳转会显示始终允许选项

关于5.x版本的Neo4j与py2neo的访问技巧

先说结果。 Neo4j是可以使用py2neo来操作的。而且网上搜到的教程和方法里,首推的http连接方法可能并不是最好的,应该用 bolt 方法可能更好。 对于大多数使用 py2neo 与 Neo4j 数据库进行交互的应用程序来说,建议使用 Bolt 协议(即…

kafka面试篇

消息队列的作用:异步、削峰填谷、解耦 高可用,几乎所有相关的开源软件都支持,满足大多数的应用场景,尤其是大数据和流计算领域, kafka高效,可伸缩,消息持久化。支持分区、副本和容错。 对批处理…

C# 属性

C# 属性 访问器(Accessors) using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp2 {class Student{private str…

Linux 常用命令 chgrp

Linux 常用命令 chgrp 作用 用于更改文件或目录的所属用户组。只有文件的所有者或超级用户(root)可以使用 chgrp 命令来更改文件的所属用户组。在使用 chgrp 命令时需要谨慎操作,确保对文件和目录进行正确的用户组更改,以避免意…

linux C/C++ 捕获 SIGSEGV 段错误信号

程序运行遇到core dumped崩溃是常见现象,有时候,我们希望程序在崩溃的时候,先做点其他操作再崩溃,比如记录崩溃时刻的堆栈信息,或是提前释放一些硬件资源等等,那么就需要让程序捕获错误信号 下面是一个捕获…

第十五届蓝桥杯模拟考试III_物联网设计与开发官方代码分析

目录 前言:显示界面部分:页面切换:数值的轮回调整:传递数据: 前言: 这次模拟的效果很不好。85分,4h的限时我花了两天完成,这个时间是远远超出要求的,而且最后还只拿到56分&#xff0…

基于electron29版本桌面应用app开发例子

基于electron29版本桌面应用app开发例子 htmljsnode.js 开发模式 生成package.json文件: yarn init --yes 或 npm init --yes 运行打包 yarn dev yarn build # electron与electron-builder版本不兼容问题处理办法: 在package.json中scripts中添加 “…

解决在 yolov8 训练自己的数据集时,matplotlib 中文乱码问题【woodwhales.cn】

为了更好的阅读体验,建议移步至笔者的博客阅读:解决在 yolov8 训练自己的数据集时,matplotlib 中文乱码问题 在 yolov8 训练自己的数据集时,如果 class 字典使用了中文,则在训练过程中会出现形如下面的警告&#xff1a…

面试官:(...)扩展运算符是深拷贝吗?

一、情景再现 金三银四,最近找工作的小伙伴是扑面而来,这其中少不了我的好朋友张某某同学,我们‘相依为命’,我经常开导他,这不最近的一次面试中他就遇到这样一个考题: 面试官:(...&…

亚远景科技-什么是Hardware SPICE(HW SPICE)硬件过程改进与能力判定模型 ?

intacs硬件SPICE(Software Process Improvement and Capability Determination for Hardware Engineering)是一种针对硬件工程领域的过程改进和能力评估模型,旨在支持电子硬件开发。它是基于SPICE(软件过程改进和能力评估&#xf…

【NumPy数值计算基础】NumPy数组的基本操作

目录 一、数组的索引和切片(一)数组的索引(二)数组的切片 二、数组的变换(一)数组转置(二)数组重塑(三)数组合并(四)数组分割 三、数组…

力扣242. 有效的字母异位词

思路:字母相互抵消的思路,本题字符串中只包含小写字母26位,那就新建record数组int[26],下标0-25,代表小写字母a-z, 需要通过 某字符减a 来达到这一目的; class Solution {public boolean isAnagram(String…

ginblog博客系统/golang+vue

ginblog博客系统 前台: 后台: Gitee的项目地址,点击进入下载 注意: 数据库文件导入在model里面,直接导入即可。 admin和front前后台系统记住修改https里的地址为自己的IP地址: front同上。

直播弹幕系统设计

设计一个直播弹幕系统需要考虑到系统的实时性、可扩展性、高可用性以及数据持久性等多个方面。 1. 功能需求分析 实时性:弹幕消息需要尽可能即时地显示在直播视频上。高吞吐量:系统需要处理大量用户同时发送的弹幕。数据的持久化:如果需要保…