力扣刷题记录(16)LeetCode:62、63、343、96

news2024/12/23 14:05:54

目录

62. 不同路径

63. 不同路径 II 

343. 整数拆分 

 96. 不同的二叉搜索树

总结 



这题比较简单,直接声明一个二维数组来保存到达该点有几种路径。到达当前点的方法由当前点的左边格子和右边格子决定。

class Solution {
public:
    int uniquePaths(int m, int n) {

        vector<vector<int>> mesh;
        for(int i=0;i<m;i++)
        {
            vector<int> row;
            for(int j=0;j<n;j++)
            {
                //如果是第一行
                if(i==0)
                {
                    row.push_back(1);
                }
                //不是第一行
                else
                {
                    if(j==0)    row.push_back(mesh[i-1][j]);
                    else    row.push_back(mesh[i-1][j]+row[j-1]);
                }
            }
            mesh.push_back(row);
        }
        return mesh[m-1][n-1];
    }
};

63. 不同路径 II 

 

这题与上题类似,就是在确定到达当前点的路径总数时判断一下上方及左方是否有障碍物。一共分三种情况。

1.上方有障碍

2.左方有障碍

3.都没障碍

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        for(int i=0;i<obstacleGrid.size();i++)
        {
            for(int j=0;j<obstacleGrid[0].size();j++)
            {
                if(obstacleGrid[i][j]==1)
                {
                    obstacleGrid[i][j]=-1;
                    continue;
                }   
                //第一行
                if(i==0)
                {
                    if(j==0)    obstacleGrid[i][j]=1;
                    else
                    {
                        //左边有障碍物
                        if(obstacleGrid[i][j-1]==-1)    obstacleGrid[i][j]=0;
                        //左边无障碍物
                        else    obstacleGrid[i][j]=obstacleGrid[i][j-1];
                    }
                }
                //非第一行
                else
                {
                    //第一列
                    if(j==0)
                    {
                        if(obstacleGrid[i-1][j]==-1)    obstacleGrid[i][j]=0;
                        else    obstacleGrid[i][j]=obstacleGrid[i-1][j];
                    }
                    //非第一列
                    else
                    {
                        if(obstacleGrid[i-1][j]==-1)    obstacleGrid[i][j]=obstacleGrid[i][j-1];
                        else if(obstacleGrid[i][j-1]==-1)   obstacleGrid[i][j]=obstacleGrid[i-1][j];
                        else    obstacleGrid[i][j]=obstacleGrid[i][j-1]+obstacleGrid[i-1][j];
                    }
                }
            }
        }
        if(obstacleGrid[obstacleGrid.size()-1][obstacleGrid[0].size()-1]==-1)   return 0;
        return obstacleGrid[obstacleGrid.size()-1][obstacleGrid[0].size()-1];
    }
};

343. 整数拆分 

 

这题也是典型的动态规划,要想知道当前值如何拆分能够使乘积最大要利用比它小的值如何拆分乘积最大。比如10,我们先将其拆分成两个数,[[1,9],[2,8],[3,7],[4,6],[5,5]]有这5种拆分方式。如果我们前面已经得到了[9,8,7,6,5]的最大拆分乘积,那遍历这几种情况就可以得到最大值啦。

注意:每种情况我们可以选择拆或者不拆,比如[3,7],我们可以不拆,也可以将它拆成[3,3,4]。

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n + 1);
        dp[2] = 1;
        for (int i = 3; i <= n ; i++) {
            for (int j = 1; j <= i / 2; j++) 
            {
                dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
            }
        }
        return dp[n];
    }
};

 96. 不同的二叉搜索树

 

这道题要找到状态转移方程,n个结点的二叉搜索树的数量与小于n个结点的二叉搜索树的数量有关联。 比如n=3,1为头结点时左边一定是0个元素、右边一定是两个元素(右边有多少种情况就是dp[2]),2为头结点时左边一定是1个元素(dp[1])、右边一定是一个元素dp[1],3为头结点时左边一定是两个元素(dp[2])、右边一定是0个元素(dp[0])。所以dp[3]=dp[0]*dp[2]+dp[1]*dp[1]+dp[2]*dp[0]。

由此可以推导出状态转移方程,dp[i]+=dp[j-1]*dp[i-j]。j是从1到n循环,代表头结点的值。i表示结点总数。

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n+1);
        dp[0]=1;
        dp[1]=1;

        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=i;j++)
            {
                dp[i]+=dp[j-1]*dp[i-j];
            }
        }
        return dp[n];
    }
};

总结 

动态规划的难点在于如何才能找到动态转移方程。动态规划是解决由重复子问题所构成的大问题。所以要从题目中提取出这个重复的子问题是什么。 

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

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

相关文章

美国联邦机动车安全标准-FMVSS

FMVSS标准介绍&#xff1a; FMVSS是美国《联邦机动车安全标准》&#xff0c;由美国运输部下属的国家公路交通安全管理局(简称NHTSA)具体负责制定并实施。是美国联邦政府针对机动车制定的安全标准&#xff0c;旨在提高机动车的安全性能&#xff0c;减少交通事故中的人员伤亡。F…

构建智慧储能物联网,4G工业路由器远程监测在线管理

物联网技术的发展为智慧储能管理带来了革命性的变化。其中&#xff0c;4G工业路由器IR5000通过丰富的连接能力如串口RS485/232或网口的方式&#xff0c;实现了与储能现场各设备的连接&#xff0c;包括电表、电能检测器、防孤岛装置、BMS电池管理系统、监控服务器、储能控制器、…

万户OA text2Html接口存在任意文件读取漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品&#xff0c;统一的基础管理平台&#xff0c;实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网…

react基于antd二次封装spin组件

目录 react基于antd二次封装spin组件组件使用组件效果 react基于antd二次封装spin组件 组件 import { Spin } from antd; import propTypes from "prop-types"; import React from react; import styleId from "styled-components"; // 使用 父div必须加…

HTML5+CSS3小实例:纯CSS实现网站置灰

实例:纯CSS实现网站置灰 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content="…

【1.10计算机组成与体系结构】校验码

目录 1.奇偶校验2.循环校验码CRC3.各个校验码的区别&#xff08;海明校验&#xff09; 1.奇偶校验 &#x1f7e2; 奇偶校验码的编码方法是: 由若干位有效信息 (如一个字节) &#xff0c;再加上一个二进制位 (校验位) 组成校验码。 &#x1f7e2; 奇校验:整个校验码 (有效信息位…

【MAC】M2 安装docker 与 mysql

一、docker下载地址 下载地址 二、安装docker完成 罗列一下docker常用命令 # 查看docker版本 docker --version# 拉取镜像 docker pull 镜像名# 查看当前所有镜像 docker images# 查看运行中的容器 docker ps -a docker ps grep| 镜像名#镜像启动操作&#xff1a; sudo dock…

[MySQL] MySQL中的内外连接

文章目录 一、内连接 1、1 概念及语法 1、2 实例讲解 二、外连接 2、1 概念及语法 2、2 左外连接 2、3 右外连接 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍♂️ &#x1f440; 专栏&#xff1a;MySQL &#x1f440; &#x1f4a5; 标题&#xff1a;MySQL中…

issue阶段的选择电路的实现

1-of-M的仲裁电路 为什么要实现oldest-first 功能的仲裁呢&#xff1f; 这是考虑到越是旧的指令&#xff0c;和它存在相关性的指令也就越多&#xff0c;因此优先执行最旧的指令&#xff0c;则可以唤醒更多的指令&#xff0c;能够有效地提高处理器执行指令的并行度,而且最旧的指…

基于PyCharm实现串口GUI编程

工具效果如下如所示 下面简单介绍一下操作流程 1.打开PyCharm软件 2.创建一个工程 3.给该工程命名 4.在main.py里面黏贴如下的代码 # This is a sample Python script. # Press ShiftF10 to execute it or replace it with your code. # Press Double Shift to search everyw…

LeetCode 583两个字符串的删除操作 72编辑距离 | 代码随想录25期训练营day56

动态规划算法13 LeetCode 583 两个字符串的删除操作 2023.12.19 题目链接代码随想录讲解[链接] int minDistance(string word1, string word2) {//思路1&#xff0c;求除了最长公共序列外&#xff0c;两个字符串需删除的字符数//以下为求最长公共序列长度的动态规划方法/*v…

竞赛保研 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; Yolov安全帽佩戴检测 危险区域进入检测 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&am…

基于SSM的通用权限管理系统

基于SSM的通用权限管理系统 一、系统介绍二、功能展示1.项目骨架2.登录3.主页 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于SSM的权限管理系统案例 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&#xff1a;Layui等 …

xcrun: error: invalid active developer path

macOS升级完成后出现 xcrun: error: invalid active developer path问题。 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun这是由于 Xcode command line tools 丢…

03-数据结构-栈与队列

1.栈 栈和队列是两种操作受限的线性表。如上图所示显示栈的结构 栈&#xff1a;先进后出&#xff0c;入栈&#xff08;数据进入&#xff09; 和出栈&#xff08;数据出去&#xff09;均在栈顶操作。 常见栈的应用场景包括括号问题的求解&#xff0c;表达式的转换和求值&#…

运维知识点-Kubernetes_K8s

Kubernetes RBAC配置不当攻击场景攻击过程 RBAC配置不当 Service Account本质是服务账号&#xff0c;是Pod连接K8s集群的凭证。 在默认情况下&#xff0c;系统会为创建的Pod提供一个默认的Service Account&#xff0c; 用户也可以自定义Service Account&#xff0c;与Service…

Postgresql中自增主键序列的使用以及数据传输时提示:错误:关系“xxx_xx_xx_seq“不存在

场景 Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入&#xff1a; Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入-CSDN博客 上面讲使用pg_dump进行postgresql的导出与导入。 如果使用Navicat可以直接连接两个库&#xff0c;则可直接使…

如何在安卓手机Termux上安装MariaDB(MySQL)并实现远程连接数据库

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

基于win安装的docker内安装sonar时启动时错误

elasticsearch exited with code 78 以下要求和建议适用于在生产中的Docker中运行Elasticearch。 将vm.max_map_count至少设置为262144要用于生产&#xff0c;必须将vm.max_map_count内核设置至少设置为262144。 如何设置vm.max_map_count取决于您的平台。 这对我来说就是&a…

easyrecovery2024免费手机版数据恢复软件下载

easyrecovery14是easyrecovery系列软件的新版本&#xff0c;也是目前行业领先的数据恢复软件&#xff0c;具备更快捷、更高效、更便捷三大特色&#xff0c;能够帮助用户轻松恢复电脑丢失的数据。目前软件支持恢复不同存储介质数据&#xff0c;包括硬盘、光盘、U盘/移动硬盘、数…