给出一个二维数组,一个人从左上角出发,最终到达右下角,沿途数字累积,求返回最小的累加和

本文主要是介绍给出一个二维数组,一个人从左上角出发,最终到达右下角,沿途数字累积,求返回最小的累加和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:给出一个二维数组arr,一个人从左上角出发,沿途只能向下或向左走,并且沿途的数数字都累加,最终到达右下角,求返回最小的累加和

举例:给出一个数组    int[][] arr = new int[][]{{3, 7,8,7}, {1, 2,6,4},{10,3,8,9},{8,1,2,0}};

需求是返回 12

解决思想:动态规划的解决方案,此处提供两个方案,一种是常规方案,另一种是节约内存的方案。

1、常规方案:

1.1、分析图如下:

人从左上角3的位置开始移动,每次只能向左或向右移动一步,到右下角0结束,找到过程最小值 12

此路径的值最小,为12 

1.2、核心代码如下:

/*** @author wanghuainan* @date 2021/7/5 10:28*/
public class NanDaoMinPathSum {public static void main(String[] args) {//     int[][] arr = new int[10][10];int[][] arr = new int[][]{{3, 7,8,7}, {1, 2,6,4},{10,3,8,9},{8,1,2,0}};//  arr = new int[][]{{2, 3}, {1, 1}};System.out.println(minSumPath1(arr));}private static int minSumPath1(int[][] arr) {//边界判断if(arr.length == 0 || arr == null || arr[0] == null || arr[0].length == 0){return 0;}int row = arr.length;int col = arr[0].length;int[][] dp = new int[row][col];//定义一个缓存数组dp[0][0] = arr[0][0];//左上角赋值//第一列赋值for(int i = 1;i < row;i++){dp[i][0] = dp[i - 1][0] + arr[i][0];}//第一行赋值for(int j = 1;j < col;j++){dp[0][j] = dp[0][j - 1] + arr[0][j];}//中间其他行列格子里赋最小值for(int i = 1;i < row;i++){for(int j = 1;j < col;j++){dp[i][j] = Math.min(dp[i - 1][j],dp[i][j - 1]) + arr[i][j];}}return dp[row - 1][col -1];//返回右下角的值}
}

2、节约内存的方案(此处按行计算,当然也可以按照列计算):

2.1、图示分析:

采用一维数组,?处的值是通过14或6中先取最小值,然后加上3,即值为9 

2.2、核心代码

/*** @author wanghuainan* @date 2021/7/5 10:28*/
public class NanDaoMinPathSum {public static void main(String[] args) {//     int[][] arr = new int[10][10];int[][] arr = new int[][]{{3, 7,8,7}, {1, 2,6,4},{10,3,8,9},{8,1,2,0}};//  arr = new int[][]{{2, 3}, {1, 1}};System.out.println(minSumPath2(arr));}private static int minSumPath2(int[][] arr) {if(arr == null || arr.length == 0 || arr[0] == null || arr[0].length == 0){return 0;}int row = arr.length;int col = arr[0].length;int[] dp = new int[col];//一维数组,仅保存一行有效数据,节约内存dp[0] = arr[0][0];//初始化第一行数据for(int j = 1;j < col;j++){dp[j] = dp[j - 1] + arr[0][j];}for(int i = 1;i < row; i++){dp[0] +=arr[i][0];for(int j = 1;j < col;j++){//得出数组中j位置的数值,左边dp[j]代表j位置最新数值,右边dp[j]代表上一行历史数据,加上m[i][j]后得到j处最新数值dp[j] = Math.min(dp[j - 1],dp[j]) + arr[i][j];}}return dp[col - 1];}}

3、两种方案的执行结果:

到此,此算法的解决方案分享完毕,这到算法算是比较简单的问题,大家一定要多多联系,定会进步很快!

这篇关于给出一个二维数组,一个人从左上角出发,最终到达右下角,沿途数字累积,求返回最小的累加和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832251

相关文章

捷瑞数字业绩波动性明显:关联交易不低,募资必要性遭质疑

《港湾商业观察》施子夫 5月22日,山东捷瑞数字科技股份有限公司(以下简称,捷瑞数字)及保荐机构国新证券披露第三轮问询的回复,继续推进北交所上市进程。 从2023年6月递表开始,监管层已下发三轮审核问询函,关注到捷瑞数字存在同业竞争、关联交易、募资合理性、期后业绩波动等焦点问题。公司的上市之路多少被阴影笼罩。​ 业绩波动遭问询 捷瑞数字成立于2000年,公司是一家以数字孪生驱动的工

数据时代的数字企业

1.写在前面 讨论数据治理在数字企业中的影响和必要性,并介绍数据治理的核心内容和实践方法。作者强调了数据质量、数据安全、数据隐私和数据合规等方面是数据治理的核心内容,并介绍了具体的实践措施和案例分析。企业需要重视这些方面以实现数字化转型和业务增长。 数字化转型行业小伙伴可以加入我的星球,初衷成为各位数字化转型参考库,星球内容每周更新 个人工作经验资料全部放在这里,包含数据治理、数据要

LeetCode--155 最小栈

题目 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) -- 将元素 x 推入栈中。pop() -- 删除栈顶的元素。top() -- 获取栈顶元素。getMin() -- 检索栈中的最小元素。 示例 MinStack minStack = new MinStack();minStack.push(-2);minStack.push

剑指offer(C++)--和为S的两个数字

题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 class Solution {public:vector<int> FindNumbersWithSum(vector<int> array,int sum) {vector<int> result;int len = array.size();if(

剑指offer(C++)--数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution {public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {int len = data.size();if(len<2)return;int one = 0;for(int i

神经网络第四篇:推理处理之手写数字识别

到目前为止,我们已经介绍完了神经网络的基本结构,现在用一个图像识别示例对前面的知识作整体的总结。本专题知识点如下: MNIST数据集图像数据转图像神经网络的推理处理批处理  MNIST数据集          mnist数据图像 MNIST数据集由0到9的数字图像构成。像素取值在0到255之间。每个图像数据都相应地标有“7”、“2”、“1”等数字标签。MNIST数据集中,

设置android返回键,保存和取得最高分

1.在.h中声明一些方法 virtual void keyBackClicked();           //Android返回键 bool isHaveSaveFile(); void getHighestHistoryScore(); 在.cpp中实现这个几个方法 void WelcomeLayer::keyBackClicked(

IOS 数组去重的几种方式

本来只知道NSSet和KeyValues的。今天又新学了几种方式 还有就是和同事学的一种方式 外层循环从0开始遍历,内层从最后一个元素开始遍历 for(int i=0;i<index;i++){  for(int j=index-1;j>i;j-- ){ } }

江西电信联合实在智能举办RPA数字员工培训班,培养“人工智能+”电信人才

近日,江西电信与实在智能合作的2024年数字员工开发应用培训班圆满闭幕。包括省公司及11个分公司的核心业务部门,超过40名学员积极报名参与此次培训,江西电信企业信息化部门总监徐建军出席活动并致辞,风控支撑室主任黄剑主持此次培训活动。 在培训会开幕仪式上,徐建军强调,科创是电信企业发展的核心动力,学习RPA技术是实现数字化转型的关键,他阐述了RPA在提高效率、降低成本和优化资源方面的价值,并鼓励学

LeetCode —— 只出现一次的数字

只出现一次的数字 I  本题依靠异或运算符的特性,两个相同数据异或等于0,数字与0异或为本身即可解答。代码如下: class Solution {public:int singleNumber(vector<int>& nums) {int ret = 0;for (auto e : nums){ret ^= e;}return ret;}};  只出现一次的数字 II