力扣:120. 三角形最小路径和

力扣:120. 三角形最小路径和

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
在这里插入图片描述

方法1:动态规划

定义一个与原来数组有相同位数的二元数组,其中的成员,对应原二维数组的每个成员的最小路径
对于一行中的各个成员的最小路径的计算,而计算主要涉及三个部分,第一部分为左边靠边位置,第二部分为右边靠边的位置,其余为中间位置。
第一部分计算为:本行靠左成员的值 + 到达上一个(上面一行靠左)的最小路径
第二部分计算为:本行靠右成员的值 + 到达上一个(上面一行靠右)的最小路径
第三部分计算为:min(到达上面一个,上面靠左一个)路径最小值 + 本行成员的值
在这里插入图片描述

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

class Solution{
public:
	int mininumtotal(vector<vector<int>>& triangle) {
		int n = triangle.size();
		vector<vector<int>> f(n, vector<int>(n));
		f[0][0] = triangle[0][0];
		for (int i = 1; i < n; ++i) {
			f[i][0] = f[i - 1][0] + triangle[i][0];
			for (int j = 1; j < i; ++j) {
				f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + triangle[i][j];
			}
			f[i][i] = f[i - 1][i - 1] + triangle[i][i];
		}
		return *std::min_element(f[n - 1].begin(), f[n - 1].end());
	}
};

int main() {
	Solution solution;
	vector<vector<int>> triangle = {
		{2},
		{3,4},
		{6,5,7},
		{4,1,8,3}
	};
	int result = solution.mininumtotal(triangle);
	cout << "mininum path sum is " << result << endl;
	return 0;
}

在这里插入图片描述

方法二:动态规划+空间优化

使用二维数组

后一行中的成员路径值,只与本行以及前一行有关,可以定义两行n列的数组,将其值进行拷贝,直至最后只有最后两行中的成员路径数值
在这里插入图片描述

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int n = triangle.size();
        vector<vector<int>> f(2, vector<int>(n));
        f[0][0] = triangle[0][0];
        for (int i = 1; i < n; ++i) {
            int curr = i % 2;
            int prev = 1 - curr;
            f[curr][0] = f[prev][0] + triangle[i][0];
            for (int j = 1; j < i; ++j) {
                f[curr][j] = min(f[prev][j - 1], f[prev][j]) + triangle[i][j];
            }
            f[curr][i] = f[prev][i - 1] + triangle[i][i];
        }
        return *std::min_element(f[(n - 1) % 2].begin(), f[(n - 1) % 2].end());
    }
};

int main()
{
	Solution solution;
	vector<vector<int>> triangle = {
		{2},
		{3,4},
		{6,5,7},
		{4,1,8,3}
	};
	int result = solution.minimumTotal(triangle);
	cout << "mininum path sum  == " << result << endl;
	return 0;
}

在这里插入图片描述

使用一维数组

从上向下,从右向左计算,计算的结果,存储在一维数组中,覆盖上一行的结果
比如二行开始,
其首先计算的为f[1] = f[0] + triangle[1][1] ,存储为f[1]
再计算f[0] = f[0] + triangle[1][0],存储为f[0]

计算第三行
其首先计算的为f[2] =f[1] + triangle[2][2] ,存储为f[2]
再计算的为f[1] = min(f[0],f[1]) + triangle[2][1] ,存储为f[1]
再计算f[0] = f[0] + triangle[2][0],存储为f[0]
以此类推,计算到n行时,更新完成

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
class Solution {
public:
	int mininumTotal(vector<vector<int>>& triangle) {
		int n = triangle.size();
		vector<int> f(n);
		f[0] = triangle[0][0];
		for (int i = 1; i < n; ++i) {
			f[i] = f[i - 1] + triangle[i][i];
			for (int j = i - 1; j > 0; --j) {
				f[j] = min(f[j], f[j - 1]) + triangle[i][j];
			}
			f[0] = f[0] + triangle[i][0];
		}
		return *min_element(f.begin(), f.end());
	}
};



int main()
{
	Solution solution;
	vector<vector<int>> triangle = {
		{2},
		{3,4},
		{6,5,7},
		{4,1,8,3}
	};
	int result = solution.mininumTotal(triangle);
	cout << "mininum path sum  == " << result << endl;
	return 0;
}

在这里插入图片描述

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

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

相关文章

特殊文件-XML文件

简介 XML全称&#xff1a;Etensible Markup Language&#xff0c;可扩展标记语言 特点 标签都是成对出现的&#xff0c;一个标签就是一个元素一个xml文件中有且只有一个根标签标签也是可以携带属性的 IDEA创建XML 简单示例 必须有抬头标签是可以携带属性的&#xff0c;但是属性…

c++程序员简历中项目怎么写?避免踩坑!

C开发 9 年&#xff0c;目前人在大厂&#xff0c;做 C 相关的开发&#xff0c;作为资深 C 面试官&#xff0c;我来聊聊面试官眼中的校招简历中的 C 项目吧&#xff0c;希望对各位学弟学妹有帮助。 1. 简历中如何介绍自己的项目&#xff1f; 从面试官的角度来说&#xff0c;我…

QAnything部署Mac m1环境

本次安装时Qanything已经更新到了v1.3.3&#xff0c;支持纯python安装。安装过程比较简单&#xff0c;如下&#xff1a; QAnything/README_zh.md at qanything-python-v1.3.1 netease-youdao/QAnything GitHub 首先需要用Anaconda3创建隔离环境&#xff0c;简要说明下Anaco…

中型企业用CRM管理软件,求推荐?

中型企业是指哪些企业呢&#xff1f; 指的是员工人数在数百至数千人之间&#xff0c;年营业额在几千万至数亿元之间的企业。这些企业通常已经形成了较为稳定的业务模式和市场定位&#xff0c;有一定的市场份额和客户基础&#xff0c;同时也在积极拓展新的业务领域和市场空间。…

工业控制(ICS)---OMRON

OMRON FINS 欧姆龙厂商 命令代码(Command CODE)特别多&#xff0c;主要关注读写相关&#xff0c;如&#xff1a; Memory Area Read (0x0101) Memory Area Write (0x0102) Multiple Memory Area Read (0x0104) Memory Area Transfer (0x0105) Parameter Area Read (0x0201) Pa…

搜维尔科技:【工业仿真】煤矿安全知识基础学习VR系统

产品概述 煤矿安全知识基础学习VR系统 系统内容&#xff1a; 煤矿安全知识基础学习VR系统内容包括&#xff1a;下井流程&#xff08;正确乘坐罐笼、班前会、井下行走注意事项、工作服穿戴、入井检身及人员清点、下井前准备工作、提升运输安全&#xff09;&#xff1b;运煤流程…

Windows平台RTMP推送|轻量级RTSP服务如何实现摄像头叠加到屏幕输出

技术背景 我们在用Windows平台RTMP推送、轻量级RTSP服务实现无纸化同屏、智慧教室等场景的时候&#xff0c;有个需求是&#xff0c;需要主讲人&#xff08;或老师&#xff09;的摄像头数据&#xff0c;叠加到屏幕上输出出去&#xff0c;这就是今天我们需要讲的视频视频叠加。 …

appium2报错:Failed to create session. ‘automationName‘ can‘t be blank

1、问题概述&#xff1f; 今天在window环境中安装了appium2.5.2版本&#xff0c;通过appium inspector连接真机的时候报错如下&#xff1a; Failed to create session. automationName cant be blank 原因分析&#xff1a;这是因为appium2的比appium1有了很大的改进&#xff…

C++ 类和对象(二)

目录 1.前言 2.类的六个默认成员函数 3.构造函数 3.1概念 3.2特性 3.2.1 函数名与类名相同 3.2.2 无返回值 3.2.3对象实例化时自动调用 3.2.4 构造函数可以重载 3.2.5 默认构造函数的自动生成 3.2.6 默认构造函数对内置类型成员的初始化 3.2.7 默认构造函数的定义 4…

小红书app缓存清除

1.背景 小伙伴们&#xff0c;手机app运行产生的缓存在不断侵占着我们的收集的内存&#xff0c;运行个半年发现内存不足20%。其实很多情况我们通过各个手机自带的缓存清除功能&#xff0c;就可以把app运行过程中产生的内存清除掉&#xff0c;节省我们不少的空间。想一想手机上a…

二分查找的时间复杂度的讲解

二分查找的代码&#xff1a; 二分查找的时间复杂度&#xff1a; 最坏的情况&#xff1a; 就是找不到和查找区间只剩一个值的时候&#xff0c;这两种都是最坏的结果&#xff0c;假设查找了x次&#xff0c;达到了最坏的结果&#xff1a; N代表每一次折半区间数据的个数&#xf…

当你拥有Xbox-GamePass就能更快体验NewGame

如果你有游戏通行证终极通行证&#xff0c;那么你就可以看到很多预售的游戏&#xff0c;以及更多游戏内容。 Shadow of the Tomb Raider: Definitive Edition《古墓丽影:暗影&#xff08;终极版&#xff09;》 征服残酷无情的丛林&#xff0c;并活着走出来。探索充满裂隙和幽深…

I2C,UART,SPI(STM32、51单片机)

目录 基本理论知识&#xff1a; 并行通信/串行通信&#xff1a; 异步通信/同步通信&#xff1a; 半双工通信/全双工通信: UART串口&#xff1a; I2C串口&#xff1a; SPI串口&#xff1a; I2C在单片机中的应用&#xff1a; 软件模拟&#xff1a; 51单片机&#xff1a;…

Linux的进程管理

进程 程序运行在操作系统中&#xff0c;是被操作系统所管理的。 为管理运行的程序&#xff0c;每一个程序在运行的时候&#xff0c;便被操作系统注册为系统中的一个&#xff1a;进程 并会为每一个进程都分配一个独有的&#xff1a;进程ID&#xff08;进程号&#xff09; 查看…

C++进阶——继承

前言&#xff1a;从这篇文章开始&#xff0c;我们进入C进阶知识的分享&#xff0c;在此之前&#xff0c;我们需要先来回顾一个知识&#xff1a; C语言有三大特性&#xff0c;分别是封装、继承和多态&#xff0c;而我们前边所分享的各种容器类&#xff0c;迭代器等&#xff0c;…

基于SpringBoot的“线上教学平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“线上教学平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 线上教学平台结构图 管理员登录界面图 学员管理界…

网络工程师-----第一天

线缆与进制转换 进制转换: 1.十进制&#xff1a; 都是以0-9这九个数字组成&#xff0c;不能以0开头。 2.二进制&#xff1a; 由0和1两个数字组成。 3.八进制&#xff1a; 由0-7数字组成&#xff0c;为了区分与其他进制的数字区别&#xff0c;开头都是以0开始。 4.十六进制…

Python数据结构【二】查找

前言 可私聊进一千多人Python全栈交流群&#xff08;手把手教学&#xff0c;问题解答&#xff09; 进群可领取Python全栈教程视频 多得数不过来的计算机书籍&#xff1a;基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。 &#x1f680;&a…

手动实现简易版RPC(下)

手动实现简易版RPC(下) 前言 什么是RPC&#xff1f;它的原理是什么&#xff1f;它有什么特点&#xff1f;如果让你实现一个RPC框架&#xff0c;你会如何是实现&#xff1f;带着这些问题&#xff0c;开始今天的学习。 接上一篇博客 手动实现简易版RPC&#xff08;上&#xff…

抖音小店运营计划表年度电商规划管理模板

【干货资料持续更新&#xff0c;以防走丢】 抖音小店运营计划表年度电商规划管理模板 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 抖音店铺运营表格 &#xff08;完整资料包含以下内容&#xff09; 目录 抖音店铺运营计划&#xff1a; 一、店铺定位与目标…