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

目录

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];
    }
};

总结 

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

接口测试和测试用例分析

只要有软件产品的公司百分之九十以上都会做接口测试&#xff0c;要做接口测试的公司那是少不了接口测试工程师的&#xff0c;接口测试工程师相对于其他的职位又比较轻松并且容易胜任。如果你想从事接口测试的工作那就少不了对接口进行分析&#xff0c;同时也会对测试用例进行研…

day21二叉树(七)

day21 代码随想录 2023.12.19 1. 530二叉搜索树的最小绝对差 害&#xff0c;开始题目看错了&#xff0c;以为求的是相连节点&#xff0c;也就是父子节点最小绝对差&#xff0c;结果提交某些测试用例没通过&#xff0c;才发现求的是任意不同节点&#xff0c;这里把我写的父子节…

抖店需要多少资金?如何开通?具体流程如下!

我是电商珠珠 新手开抖店最关心的就是资金问题&#xff0c;在网上关于抖店的资金多少的都有&#xff0c;几百几千的都有。 各个回答都不一样。 另外一个问题就是怎么开通&#xff0c;今天我就来给大家详细的讲一下。 一、资金 入驻抖店需要办理一张个体工的营业执照&#…

NLP论文阅读记录 - AAAI-23 | 01 Cogito Ergo Summ:通过语义解析图和一致性奖励对生物医学论文进行抽象总结

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1抽象概括2.2图增强摘要2.3 抽象概括的强化学习 三.本文方法COGITOERGOSUMM 框架3.1 问题陈述3.2 图表构建**事件图****AMR 图****图合并和重新连接**Model文本编码器图编码器解码器…

鸿蒙(HarmonyOS)应用开发—— video组件实操

video 组件 harmonyOS 系统提供了基础的video。下面就直接上代码 原始video 新建项目 customVideo项目 本地视频 网络地址&#xff0c;就不用说明&#xff0c;只需要把地址换成网络地址即可 在resource 文件夹下的rawfile文件夹下 添加视频 在index.ets Video({src:$rawf…

关于设计师的自我评价(合集)

设计师的自我评价篇一 本人接受过正规的美术教育&#xff0c;具有较好的美术功底及艺术素养&#xff0c;能够根据公司的需要进行设计制作&#xff0c;熟练掌握多种电脑制作软件&#xff0c;能够高效率地完成工作。本人性格开朗、思维活跃、极富创造力&#xff0c;易于沟通&…

JVM性能调优准备之Visual GC插件

文章目录 jvisualvm安装Visual GC插件Visual GC插件功能介绍区域划分spaces区域Graphs区域Histogram区域 oracle官方文章介绍 jvisualvm安装Visual GC插件 以管理员身份打开cmd命令行窗口查看JDK版本&#xff08;Visual GC插件需要对应JDK的版本&#xff09; 在cmd窗口输入 j…

揭秘`v-if`和`v-show`的区别:选择正确指令的技巧(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

AI抠图软件哪个好用?推荐这三款抠图工具给你

AI抠图软件哪个好用&#xff1f;你是否听说过AI抠图这个操作呢&#xff1f;简单来说&#xff0c;抠图就是一种对图像进行处理的技术&#xff0c;它的目的是将图片中的某些区域去除或者替换。比如&#xff0c;如果你有一张背景很杂乱的图片&#xff0c;你想把背景去掉&#xff0…

Leetcode—49.字母异位词分组【中等】

2023每日刷题&#xff08;六十四&#xff09; Leetcode—49.字母异位词分组 实现代码 class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> mp;for(auto str: s…

uniapp图片上传说明

目录 1.文件上传组件 2.单文件上传 3.多文件上传 4.注意点 1.文件上传组件 前端上传组件使用uni-file-picker&#xff0c;可以自行进行下载使用。默认上传到绑定的服务空间&#xff0c;配置属性auto-upload为false关闭自动上传&#xff0c;可以限定上传的是图片还是文件&am…

【PHP入门】1.3-数据类型、转换、判断

-数据类型- 数据类型&#xff1a;data type&#xff0c;在 PHP中指的是存储的数据本身的类型&#xff0c;而不是变量的类型。 PHP是一种弱类型语言&#xff0c;变量本身没有数据类型。 1.3.1PHP的八种数据类型 在PHP中将数据分为三大类八小类&#xff1a; 简单&#xff0…

JavaSE学习笔记 Day20

JavaSE学习笔记 Day20 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 上一篇 文章目录 JavaSE学习笔记 Day20十七、数据结构与算法17.1算法17.1.1冒泡排序17.1.2选择排序17.1.3插入排序17.1.4三个排序的区别 17.2顺序表17.2.1顺序表代码实现17.2.2顺…

JavaEE:线程池精讲

目录 一.什么是线程池 二.线程池的实现原理 &#x1f388;为什么要有工厂模式&#xff1f; 三.线程池的构造方法解读 &#x1f388;线程池的拒绝策略 四.自己实现一个线程池 一.什么是线程池 简单来说&#xff0c;线程池就好比一块鱼塘&#xff0c;鱼塘中的每条鱼就是一个线程…

HackTheBox - Medium - Windows - Authority

Authority 终于把easy的机器刷的八八九九了&#xff0c;开始新一轮的Medium机器&#xff0c;Medium难度以上的我都会写wp&#xff0c;保持学习&#xff0c;我的CRTO进度也快结束了。 Authority是一台中等难度的 Windows 计算机&#xff0c;它强调了错误配置、密码重用、在共享…

2023 英特尔On技术创新大会直播 |让更多人了解AI魅力

2023 英特尔On技术创新大会直播 |让更多人了解AI魅力 前言&#xff1a;主要领域:人工智能&#xff1a;使用 OpenVINO™ 落地边缘端生成式 AIOpenVINO™学习总结&#xff1a; 新一代 AI PC计算平台&#xff1a;新一代至强平台&#xff1a;边云协同&#xff1a;先进技术&#xff…

深入探索Git的高级技巧与神奇操作(分支,高效合并)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 深入探索Git的高级技巧与神奇操作 前言强制推送的妙用1. 什么是强制推送&#xff1f;2. 为什么需要使用强制推送&#xff1f;3. 强制推送的风险与注意事项4. 如何正确、安全地执行强制推送步骤&#x…

JDK21+HADOOP3.2.2+Windows安装步骤

哈哈哈 最近转战大数据这块了&#xff0c;分享一下hadoop3.2.2的安装步骤 借鉴了不少大佬的文章&#xff0c;如有雷同&#xff0c;都是大佬们的 1.JDK安装 我选择的是JDK21 以下是下载网址和截图&#xff0c;这个没有太多的&#xff0c;一般下载最新的就可以 JDK: Java Down…

Golang学习之路一一Hello, World

Golang学习之路一一Hello, World golang工作目录下src下新建一个项目demo,如图: 在demo下新建hello_world.go文件,内容如下: package main //声明本文件的package名import "fmt" //import语言的fmt库——---用于输出func main() {fmt.Println("Hello, World!&…

【2.2操作系统】进程管理

目录 1.进程的基本概念2.进程的状态3.信号量与PV操作4.前趋图5.死锁6.银行家算法 1.进程的基本概念 &#x1f31f;进程是程序在一个数据集合上运行的过程&#xff0c;它是系统进行资源分配和调度的一个独立单位。它由程序块、进程控制块 (PCB) 和数据块三部分组成。 &#x1f…