刷题28-30(力扣0322/0078/0221)

0322. 零钱兑换 

题目:

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。

基本思路:将金币从大到小开始排列,先拿最大的,再拿后面次大的,以此类推。【失败】

class Solution {
public:int coinChange(vector<int>& coins, int amount) {sort(coins.begin(),coins.end());int size=coins.size();if(amount==0) return 0;int ans=0;int remains=amount;for(int i=size-1;i>=0;i--){while(remains>=coins[i]){remains-=coins[i];ans++;}}return (remains>0)?-1:ans;}
};

但显然有bug,思考一顿发现,他可能不需要最后一个,可以是倒数第二个拼起来 ,例如上面这个例子3+4可以出现7但运行时依然把5放上了:

所以进行改进: 如果再进行一层遍历,便从哪一个开始,显然复杂度太高。

这个时候想到了,动态规划

创建了一个长度为 amount+1 的数组 dp,dp[i] 表示凑齐金额 i 所需的最少硬币数目。然后通过迭代更新 dp 数组,最终返回 dp[amount]。如果 dp[amount] 大于 amount,则表示无法凑出总金额,返回 -1。

代码:

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, amount + 1);dp[0] = 0; // if(amount==0)return 0;for (int i = 1; i <=amount; i++) {for (int j = 0; j < coins.size(); j++) {if (coins[j] <= i)//硬币数值小于总数dp[i] = min(dp[i],dp[i-coins[j]]+1);//可以选择放还是不放。}}return dp[amount]>amount?-1:dp[amount];}
};

每一次dp都可以选择放还是不放。不放就是dp[i]=dp[i];放的话,首先数量要+1,谁的数量呢?是(当前存放金钱总额-放入的金币额 )所需的数量加1。

vector<int> dp(amount + 1, amount + 1);

创建了一个名为 dp 的整型向量(vector),并初始化该向量的大小为 amount + 1,所有元素的初始值都设置为 amount + 1

具体来说,这行代码创建了一个大小为 amount + 1 的整型向量 dp,并且用 amount + 1 来填充所有的元素。在动态规划问题中,通常会使用类似这样的数组来记录中间状态或者保存子问题的解,以便后续计算。在这个特定的动态规划问题中,dp[i] 代表凑齐金额 i 所需的最少硬币数量,初始值设为 amount + 1 也是为了确保后续更新时能正确比较和更新数值。

本题over


78. 子集

题目:

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

思路:这道题自己想的就是遍历。思考用两层for循环,控制左右界限,放之间的元素。后来的时候,又看到一个题解

遍历枚举:

大概意思是:最外层遍历数组的元素,内层循环:复制上一步的子集,然后将当前元素加到复制的子集里面 ,构成新的子集。

举个例子:比如{1,2,3} :
  • 我先产生{1}的子集--》ans={{},{1}},
  • 我复制这个子集subset={{},{1}};此时数组元素遍历到‘2’;
  • 把‘2‘’这个元素加到subset里面subset={{2},{1,2}};
  • 把subset’这个元素加到ans里面此时ans={{},{1},{2},{1,2}}
  • 3同理  1)subset={{},{1},{2},{1,2}};2)subset={{3},{1,3},{2,3},{1,2,3}}
  • 3)ans={{},{1},{2},{1,2},{3},{1,3},{2,3},{1,2,3}}
代码 
class Solution {
public:// 生成一个整数数组的所有可能子集vector<vector<int>> subsets(vector<int>& nums) {// 初始化结果集,包含空集vector<vector<int>> ans = {{}};// 遍历原数组中的每个元素for (int num : nums) {// 获取当前结果集的大小int n = ans.size();// 遍历当前结果集中的每个子集for (int i = 0; i < n; ++i) {// 复制当前子集vector<int> subset = ans[i];// 将当前元素加入子集中subset.push_back(num);// 将更新后的子集加入结果集ans.push_back(subset);}}// 返回生成的所有子集return ans;}
};

二进制位法 

还有使用二进制位来编写的,看了半天没看懂,后来求助解释一下吧

  • 对于长度为 n 的原始数组,通过遍历 0 到 2^n - 1 的所有数字,可以表示所有可能的子集。
  • 在内层循环中,根据当前数字 i 的二进制表示中的 1,将对应位置的元素加入当前子集。
  • 最终将每个生成的子集添加到结果集中,得到所有可能的子集
举个例子
当我们具体遍历生成子集的过程时,以数组 {3,2,1} 为例:当 i = 0 时,二进制表示为 000,对应空集 {}。内层循环不执行,因为没有任何元素被选中。
当 i = 1 时,二进制表示为 001,对应子集 {3}。内层循环执行,检查第 0 位是否为 1,发现是,将 nums[0](即 3)加入到当前子集中。
当 i = 2 时,二进制表示为 010,对应子集 {2}。内层循环执行,检查第 1 位是否为 1,发现是,将 nums[1](即 2)加入到当前子集中。
当 i = 3 时,二进制表示为 011,对应子集 {2, 3}。内层循环执行,检查第 0 和第 1 位是否为 1,发现都是,将 nums[0] 和 nums[1] 加入到当前子集中。
当 i = 4 时,二进制表示为 100,对应子集 {1}。内层循环执行,检查第 2 位是否为 1,发现是,将 nums[2](即 1)加入到当前子集中。
当 i = 5 时,二进制表示为 101,对应子集 {1, 3}。内层循环执行,检查第 0 和第 2 位是否为 1,发现第 0 位和第 2 位为 1,将 nums[0] 和 nums[2] 加入到当前子集中。
当 i = 6 时,二进制表示为 110,对应子集 {1, 2}。内层循环执行,检查第 1 和第 2 位是否为 1,发现第 1 位和第 2 位为 1,将 nums[1] 和 nums[2] 加入到当前子集中。
当 i = 7 时,二进制表示为 111,对应子集 {1, 2, 3}。内层循环执行,检查所有位都为 1,将所有元素 {1, 2, 3} 加入到当前子集中。
通过这样的遍历过程,我们可以逐步生成出数组 {1, 2, 3} 的所有可能子集。
代码: 
class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> ans; // 存储所有可能的子集int n = nums.size(); // 原始数组的长度// 遍历所有可能的子集长度for (int i = 0; i < (1 << n); i++) {vector<int> subset; // 当前子集// 对于每个子集长度,遍历原始数组for (int j = 0; j < n; j++) {// 检查第 j 位是否在当前子集中if (i & (1 << j)) {subset.push_back(nums[j]); // 将元素加入当前子集}}ans.push_back(subset); // 将当前子集加入结果集}return ans;}
};
 其实这道题最最重要的是回溯思想!!
  • .  -. - 力扣(LeetCode)总结了回溯问题类型,带你搞懂回溯算法(大量例题)
  • 看这个题解就可以

本题over

221. 最大正方形

思想:动态规划

我们可以使用动态规划来解决这个问题。以

假设我们有一个二维矩阵 matrix,其中每个元素是 '0' 或 '1'。我们定义一个额外的二维数组 dp 来存储在以当前位置为右下角的情况下的最大正方形边长。

  1. 首先,将 dp 数组初始化为与原始矩阵相同大小,类型为整数。将第一行和第一列直接复制为原始矩阵的值(因为在边界上无法形成正方形)。

  2. 对于其余位置 (i, j),如果 matrix[i][j] 是 '1',则考虑它左侧、上方和左上方三个位置的 dp 值,取它们的最小值并加 1,dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1

  3. 在更新 dp 的过程中,记录下出现的最大边长值,即可得到最大正方形的边长。

  4. 最后,返回最大正方形的面积,即边长的平方。

这样,通过动态规划算法,我们可以高效地找到给定矩阵中的最大正方形的边长。

dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1。
如图,当dp[i][j] 来存储在以当前位置[i][j]为右下角的情况下的最大正方形边长时,
dp的值就与上[i-1][j] 左[i][j-1] 左上[i-1][j-1]三个位置的dp相关。看图可以发现与他们最小值相关。
为什么要加1,因为当前位置计算的话,可定是1,可以构成一个小正方形
图解 

代码如下:一定要分清行列
class Solution {
public:int maximalSquare(vector<vector<char>>& matrix) {int n = matrix.size();int m = matrix[0].size();if (m == 0 || n == 0)return 0;int max_len = 0;vector<vector<int>> dp(n, vector<int>(m));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (matrix[i][j] == '1') {if (i == 0 || j == 0) {//第一行第一列dp值=matrix值dp[i][j] = 1;} else {dp[i][j] = min({dp[i - 1][j], dp[i][j - 1],dp[i - 1][j - 1]}) +1;}max_len = max(max_len, dp[i][j]);}}}return max_len * max_len;}
};

 

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

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

相关文章

一文带你看懂 前后端之间图片的上传与回显

一文带你看懂 前后端之间图片的上传与回显 前言 看了很多类似的文章&#xff0c;发现很多文章&#xff0c;要不就是不对&#xff0c;要不就是代码写的不通俗易懂&#xff0c;所以有了这篇文章&#xff0c;我将会从原理到实战&#xff0c;带你了解 实战包含前端 原生 vue3 rea…

Gold Effects

HDRP、URP、LWRP和标准支持 完全可定制的金币效果。几乎每个属性都是可调整的,您可以更改这些效果的颜色、渐变、噪波纹理和整体形状。支持HDRP、URP和LWRP,当然也支持标准渲染器。易于拖放设置,带有定制示例的演示场景。使用标准Unity Animator为箱子制作动画,因此您可以轻…

Python爬虫与数据可视化源码免费领取

引言 作为一名在软件技术领域深耕多年的专业人士&#xff0c;我不仅在软件开发和项目部署方面积累了丰富的实践经验&#xff0c;更以卓越的技术实力获得了&#x1f3c5;30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定&#xff0c;也是对我的创新精神和专业承诺…

电子科技大学链时代工作室招新题C语言部分---题号H

1. 题目 最有操作的一道题&#xff0c;有利于对贪心算法有个初步了解。 这道题的开篇向我们介绍了一个叫汉明距离的概念。 汉明距离指的就是两个相同长度的字符串的不同字符的个数。 例如&#xff0c;abc和acd&#xff0c;b与c不同&#xff0c;c与d不同&#xff0c;所以这两个…

每周一算法:迭代加深A*

题目链接 AcWing 180. 排书 题目描述 给定 n n n 本书&#xff0c;编号为 1 ∼ n 1\sim n 1∼n。 在初始状态下&#xff0c;书是任意排列的。 在每一次操作中&#xff0c;可以抽取其中连续的一段&#xff0c;再把这段插入到其他某个位置。 我们的目标状态是把书按照 1 ∼…

牛客题霸-SQL进阶篇(刷题记录一)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多&#xff0c;因此本文不再展示&#xff0c;只提供 MySQL 代码与示例输出。 部分题目因…

青海200MW光伏项目 35kV开关站图像监控及安全警示系统

一、背景 随着我国新能源产业的快速发展&#xff0c;光伏发电作为清洁能源的重要组成部分&#xff0c;得到了国家政策的大力扶持。青海作为我国光伏资源丰富地区&#xff0c;吸引了众多光伏项目的投资建设。在此背景下&#xff0c;为提高光伏发电项目的运行效率和安全性能&…

基于Java中的SSM框架实现万卷图书馆书籍借阅管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现万卷图书馆书籍借阅管理系统演示 摘要 图书管理系统&#xff0c;是一个由人、计算机等组成的能进行管理信息的收集、传递、加工、保存、维护和使用的系统。利用信息控制企业的行为&#xff1b;帮助企业实现其规划目标。 图书馆管理系统&#xff0c;能…

二、typescript基础语法

一、条件语句 二、函数 1、有名函数 function add(x:number, y:number):number {return x y;}2、匿名函数 let add function (x:number, y:number):number {return x y;}函数可选参数 function buildName(firstname: string, lastname?:string) {if (lastname) {return fi…

asp.net mvc 重新引导视图路径,改变视图路径

asp.net mvc 重新引导视图路径&#xff0c;改变视图路径 使用指定的控制器上下文和母版视图名称来查找指定的视图 通过本文学习&#xff0c;你可以根据该技法&#xff0c;去实现&#xff0c;站点自定义皮肤&#xff0c;手机站和电脑站&#xff0c;其他设备站点&#xff0c;在不…

3.面向对象中级

文章目录 包访问修饰符封装继承继承使用细节继承内存布局及细节 Supersuper使用细节super与this比较 overwrite多态对象的多态&#xff1a;向上转型&#xff1a;向下转型&#xff1a;多态细节动态绑定机制 Object类equalshashcodetoStringfinalize 包 区分相同名字的类&#x…

LeetCode讲解算法1-排序算法(Python版)

文章目录 一、引言问题提出 二、排序算法1.选择排序&#xff08;Selection Sort&#xff09;2.冒泡排序3.插入排序&#xff08;Insertion Sort&#xff09;4.希尔排序&#xff08;Shell Sort&#xff09;5.归并排序&#xff08;Merge Sort&#xff09;6.快速排序&#xff08;Qu…

linux之shell脚本基础

1.构建基础脚本 1.1 创建shell脚本 1.1.1 第一行需要指定使用的shell # 用作注释行.shell并不会处理脚本中的注释行,但是第一行的注释,会告诉shell使用哪个shell来运行脚本. #!/bin/bash 1.1.2 让shell找到你的脚本 直接运行脚本会提示-bash: a.sh: command not found.因…

Selenium 自动化 —— Selenium IDE录制、回放、导出Java源码

Hello Selenium 示例 之前我们在专栏的第一篇文章中演示了使用使用Selenium进行百度搜索的Hello world示例。 代码不复杂非常简单&#xff1a; public static void main(String[] args) {WebDriver driver null;try {// 设置Chrome驱动的路径 // System.setPro…

Javaweb学习记录(三)请求响应案例

下面为一个请求响应案例&#xff0c;postman发送请求&#xff0c;服务器响应将一个xml文件中的数据通过读取解析&#xff0c;将其用Result类标准的格式返回前端&#xff0c;在前端用json的方式显示 后端Controller代码 1、通过本类的字节码文件得到类加载器并寻找到需要解析的…

如何使用 ArcGIS Pro 生成TIN

三角网是一种常用于表示地表地形的数字地球模型&#xff08;DEM&#xff09;方式&#xff0c;我们可以通过 ArcGIS Pro 将等高线和高程点转换为TIN&#xff0c;这里为大家介绍一下转换方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的高…

MATLAB环境下基于振动信号的轴承状态监测和故障诊断

故障预测与健康管理PHM分为故障预测和健康管理与维修两部分&#xff0c;PHM首先借助传感器采集关键零部件的运行状态数据&#xff0c;如振动信号、温度图像、电流电压信号、声音信号及油液分析等&#xff0c;提取设备的运行监测指标&#xff0c;进而实现对设备关键零部件运行状…

python 爬取杭州小区挂牌均价

下载chrome驱动 通过chrome浏览器的 设置-帮助-关于Google Chrome 查看你所使用的Chrome版本 驱动可以从这两个地方找: 【推荐】https://storage.googleapis.com/chrome-for-testing-publichttp://npm.taobao.org/mirrors/chromedriver import zipfile import os import r…

前端面试拼图-知识广度

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录并添加部分可参考的文档&#xff0c;如下... 1. 移动端H5 click有300ms延迟&#xff0c; 如何解决&#xff1f; 背景&#xff1a;double tap to zoom 移动端H5中的300ms点击延迟问题通常是由浏览…

【地图】腾讯地图 - InfoWindow 自定义信息窗口内容时,内容 html 嵌套混乱问题

目录 需求描述问题问题代码页面展示 解决原因解决办法解决代码页面展示 代码汇总注 需求描述 腾讯地图上画点位&#xff0c;点击点位展示弹框信息 问题 问题代码 // 打开弹框 openInfoWindow(position, content) {this.infoWindow new TMap.InfoWindow({map: this.map,posit…