动态规划-构建乘积数组

news2024/12/29 10:56:48

**

描述

给定一个数组 A[0,1,…,n-1] ,请构建一个数组 B[0,1,…,n-1] ,其中 B 的元素 B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定 B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2])
对于 A 长度为 1 的情况,B 无意义,故而无法构建,用例中不包括这种情况。

数据范围:1≤n≤10 ,数组中元素满足 ∣val∣≤10
示例1
输入:
[1,2,3,4,5]
返回值:
[120,60,40,30,24]
示例2
输入:
[100,50]
复制
返回值:
[50,100]

题目分析

这题算个easy的题,原因是它的暴力解法很简单。如果要求时间复杂度是o(n),我觉得可以算作一个mediem题。题目描述的很清晰,没什么弯弯绕绕,就是要我们输出一个给定数组乘积的数组,数组的每一项都分别少乘一个数。

题解

暴力解法

暴力解法很简单,直接根据题意,每次乘的时候少乘一个数,2次for循环就能解决问题,下面直接上代码。

import java.util.*;
public class Solution {
    public int[] multiply (int[] A) {
        int[] b= new int[A.length];
        for(int i=0;i<A.length;i++){
            int res = 1;
            for(int j=0;j<A.length;j++){
                if(i==j) continue;
                res = res*A[j];
            }
            b[i] = res;
        }
        return b;
    }
}

暴力解法不做过度解释,相信大家都能看懂,同时它的时间复杂度也达到了惊人的o(n2)

两次遍历

为了降低暴力解法的时间复杂度,我们必须得有利用空间来置换时间的想法。我们可以把数组B的结果用一个表格来列举出来,如下图:
B数组结果
我们可以先忽略掉B[n]这一行,直接看带有A的举证
矩阵A
我们可以看到,这个矩阵以1为分割线,将矩阵分为了上下两个三角形。而B的结果就是这个矩阵每一行的乘积。
下三角用连乘可以很容求得,上三角,从下向上其实也是连乘。

因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[n]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去,两次遍历,结果就出来了。

接下来我们直接上代码:

import java.util.*;
public class Solution {
    public int[] multiply (int[] A) {
        int[] b= new int[A.length];
        b[0] = 1;
        //第一次遍历算上三角,也就是对角线下面的三角形,我们根据规律可以看出b[0]的值直
        //接就是1,后面b[i]的值就是上一层b[i-1]的值乘上A[i-1]即可。
        for(int i=1;i<A.length;i++){
            b[i] = A[i-1]*b[i-1];
        }
        //第二次遍历,我们再把下三角累乘出来,分别跟上面的b[i]做乘积,这样每层的结果就
        //出来了,同时我们需要一个temp临时变量来记录每次累乘的结果
        int temp = 1;
        for(int i=A.length-1;i>=0;i--){
        //每次累乘的结果乘上b[i]就是那一行的值咯
            b[i] = b[i]*temp;
            /再进行下一次累乘
            temp = temp*A[i];  
        }
        return b;
    }
}

动态规划

说到动态规划,我们肯定会想到动态规划的三个步骤
1.确定状态
2.定义状态转移方程
3.求得最优解

其实上面两次遍历的思想我们稍微进行转变一下,就可以变成动态规划了,我们把第一次为了计算上三角而遍历累乘的结果利用动态规划数组进行存储起来,然后再反向对动态规划数组的结果和下三角逐行相乘即可得到结果数组。

1.确定状态

我们利用动态规划主要是为了保存上三角的值,那么dp[0]=1;

2.定义状态转移方程

状态转移方程肯定就是三角下一行的值等于上一行的值乘以A数组上一行对应下标的值,也就是dp数组第i行的值等dp数组第i-1行的值乘上A数组第i-1的下标的值。
转换成代码形式就是
dp[i] = dp[i-1]*A[i-1]

3.求得最优解

得到上三角的值,我们再反向对动态规划数组的结果和下三角逐行相乘即可得到结果数组。
其实我们只需要将两次遍历的代码中B数组用dp数组代替就可以了,代码其实可以是一摸一样的,是不是很容易。

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

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

相关文章

《011.SpringBoot+vue之汽车销售管理系统》

《011.SpringBootvue之汽车销售管理系统》 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; 1.登录 2.销…

LeetCode刷题总结(一)

文章目录 前言题型排序问题动态规划 前言 本文把刷题过程中的总结记下来&#xff0c;方便未来回顾的时候继续拓展。 题型 排序问题 排序问题的解决方法有很多。对于简单算法来说&#xff0c;最重要的是记住思路&#xff1b;对于高级算法来说&#xff0c;最重要的是记住细节…

linux下搭建gperftools工具分析程序瓶颈

1. 先安装 unwind //使用root wget https://github.com/libunwind/libunwind/archive/v0.99.tar.gz tar -xvf v0.99.tar.gz cd libunwind-0.99 autoreconf --force -v --install ./configure make sudo make install2. 安装gperftools wget https://github.com/gp…

Linux下内网穿透实现云原生观测分析工具的远程访问

&#x1f4d1;前言 本文主要是Linux下内网穿透实现云原生观测分析工具的远程访问设置的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &…

Redis为什么要使用SDS作为基本数据结构

Redis为什么要使用SDS作为基本数据结构 Redis SDS与C语言中字符串的对比二进制安全兼容部分C字符串函数 Redis SDS与C语言中字符串的对比 SDS中保存了字符串的长度属性&#xff0c;我们在获取字符串长度是的时间复杂度为O(1)&#xff0c;而C中字符串则需要对字符串进行遍历时间…

【Spring之底层核心架构概念解析】

文章目录 一、BeanDefinition二、BeanDefinitionReader2.1、AnnotatedBeanDefinitionReader2.2、XmlBeanDefinitionReader 五、ClassPathBeanDefinitionScanner六、BeanFactory七、ApplicationContext7.1、AnnotationConfigApplicationContext7.2、ClassPathXmlApplicationCont…

LeetCode 26. 删除有序数组中的重复项 简单

题目 - 点击直达 1. 26. 删除有序数组中的重复项 简单1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 26. 删除有序数组中的重复项 简单 1. 题目详情 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复…

黑客技术-小白自学

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

PLSQL工具 数据库连接名的设置

在help >>surpost info 能看到 这东西好难用啊。。不直接显示url,非要搞个名称。。

7个学习自动化测试小技巧希望能帮助到你

一、编程语言 当我开始担任手动测试人员时&#xff0c;我不喜欢编码。但是&#xff0c;当我逐渐进入自动化领域时&#xff0c;对我来说很清楚&#xff0c;如果没有对编程语言的一些基本了解&#xff0c;就无法编写逻辑自动化测试脚本。 对编程有一点了解&#xff0c;不仅可以…

8 STM32标准库函数 之 实时时钟(RTC)所有函数的介绍及使用

8 STM32标准库函数 之 实时时钟&#xff08;RTC&#xff09;所有函数的介绍及使用 1. 图片有格式2 文字无格式二、RTC库函数固件库函数预览2.1 函数RTC_ITConfig2.2 函数RTC_EnterConfigMode2.3 函数RTC_ExitConfigMode2.4 函数RTC_GetCounter.2.5 函数RTC_SetCounter2.6 函数R…

评估 RAG 的神器来啦!TruLens + Milvus=?

大型语言模型&#xff08;LLM&#xff09;的日益普及引爆了向量数据库赛道&#xff0c;向量搜索技术也越发受到开发者关注。目前&#xff0c;主流的向量搜索技术提供者包括向量数据库 Milvus 和 Zilliz Cloud&#xff0c;向量搜索库 FAISS&#xff0c;以及与传统数据库集成的向…

清华陆向谦教授提到的纽约时报的一篇文章-探讨学历贬值

文章内容来自&#xff1a; https://www.nytimes.com/2017/11/01/education/edlife/stem-jobs-industry-careers.html By Steve Lohr Nov. 1, 2017 阅读简体中文版閱讀繁體中文版 The national priority in education can be summed up in a four-letter acronym: STEM. And…

数据仓库工具箱-第三章-零售业务

文章目录 一、维度模型设计的4步过程1.1 第一步&#xff1a;选择业务过程1.2 第二步&#xff1a;声明粒度1.3 第三步&#xff1a;确定维度1.4 第四步&#xff1a;确定事实 二、零售业务案例研究2.1 第一步&#xff1a;选择业务过程2.2 第二步&#xff1a;声明粒度2.3 第三步&am…

JS加密/解密之用jsjiami保护您的劳动成果

当保护 JavaScript 代码成为开发者关注的重要问题时&#xff0c;许多人会寻求使用加密工具来确保其代码的安全性。下面是一个关于开发者张三如何使用 AES 加密结合 jsjiami来保护其通用后台管理框架的故事&#xff1a; 张三的故事 张三是一位资深的软件工程师&#xff0c;他花…

IT项目管理必备软件,这10款精心整理的项目管理工具请收好!

在快节奏的办公环境下&#xff0c;拥有一支高效的团队是成功的关键。每个团队成员需要能够迅速地沟通&#xff0c;共享信息&#xff0c;跟踪项目进度&#xff0c;并协调工作流程。而为了达到这样的效率&#xff0c;我们需要用到各种强大而实用的项目协作工具。 团队协作工具有…

无人机航迹规划:五种最新智能优化算法(COA、SWO、KOA、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;LSO、SWO、KOA、GRO、LO&#xff09;简介 1、小龙虾优化算法COA 小龙虾优化算法&#xff08;Crayfsh optimization algorithm&#xff0c;COA&#xff09;由Jia Heming 等人于2023年提出&#xff0c;该算法模拟小龙虾的避暑、竞争和觅食行为&#xf…

基于AI智能分析网关的智慧视频监控系统一站式解决方案

1、功能概述 TSINGEE智能分析网关EasyCVR智慧视频监控系统基于云-边-端一体化协同架构&#xff0c;可兼容多协议、多类型的设备接入&#xff0c;实现视频数据采集、海量视频汇聚与处理、按需调阅、全网分发、 告警消息推送、数据级联共享、AI智能分析接入等视频能力服务&#…

我用Devchat开发了公务员报名确认系统自动登录脚本,再也不用担心挤不进去了

#AI编程助手哪家好&#xff1f;DevChat“真”好用 # 演示效果 我用Devchat开发了公务员报名确认系统自动登录&#xff0c;再也不用担心挤不进去了 目录 演示效果前言粉丝独家专属红包码DevChat是什么&#xff1f;DevChat AI编程助手有哪些优势一、安装Vscode1、下载vscode链接…

字形变换-头歌

将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行Z字形排列。之后&#xff0c;你的输出需要从左往右逐行读取&#xff0c;产生出一个新的字符串 示例 : 输入: s "QAZWSXEDCRFVTG"&#xff0c;numRows 4 输出:"QETAXDVGZSCFWR&…