【优选算法】(第十四篇)

news2024/10/1 17:12:36

目录

寻找数组的中⼼下标(easy)

题目解析

讲解算法原理

编写代码

除⾃⾝以外数组的乘积(medium)

题目解析

讲解算法原理

编写代码


寻找数组的中⼼下标(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个整数数组nums,请计算数组的中⼼下标。
数组中⼼下标是数组的⼀个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中⼼下标位于数组最左端,那么左侧数之和视为0,因为在下标的左侧不存在元素。这⼀点对于中⼼下标位于数组最右端同样适⽤。
如果数组有多个中⼼下标,应该返回最靠近左边的那⼀个。如果数组不存在中⼼下标,返回-1。
⽰例1:输⼊:nums=[1,7,3,6,5,6]输出:3
解释:中⼼下标是3。左侧数之和sum=nums[0]+nums[1]+nums[2]=1+7+3=11,右侧数之和sum=nums[4]+nums[5]=5+6=11,⼆者相等。
⽰例2:输⼊:nums=[1,2,3]输出:-1
解释:数组中不存在满⾜此条件的中⼼下标。
⽰例3:输⼊:nums=[2,1,-1]输出:0
解释:中⼼下标是0。左侧数之和sum=0,(下标0左侧不存在元素),右侧数之和sum=nums[1]+nums[2]=1+-1=0。
提⽰:1<=nums.length<=10^4-1000<=nums[i]<=1000

讲解算法原理

解法(前缀和):
算法思路:
从中⼼下标的定义可知,除中⼼下标的元素外,该元素左边的「前缀和」等于该元素右边的「后缀和」。
▪ 因此,我们可以先预处理出来两个数组,⼀个表⽰前缀和,另⼀个表⽰后缀和。▪ 然后,我们可以⽤⼀个 for 循环枚举可能的中⼼下标,判断每⼀个位置的「前缀和」以及
「后缀和」,如果⼆者相等,就返回当前下标。

编写代码

c++算法代码:

class Solution {
public:
 int pivotIndex(vector<int>& nums) {
 // lsum[i] 表⽰:[0, i - 1] 区间所有元素的和 // rsum[i] 表⽰:[i + 1, n - 1] 区间所有元素的和 int n = nums.size();
 vector<int> lsum(n), rsum(n);
 // 预处理前缀和后缀和数组
 for(int i = 1; i < n; i++)
 lsum[i] = lsum[i - 1] + nums[i - 1];
 for(int i = n - 2; i >= 0; i--)
 rsum[i] = rsum[i + 1] + nums[i + 1];
 // 判断
 for(int i = 0; i < n; i++)
 if(lsum[i] == rsum[i])
 return i;
 return -1;
 }
};

java算法代码:

class Solution
{
 public int pivotIndex(int[] nums) 
 {
 // lsum[i] 表⽰:[0, i - 1] 区间所有元素的和 // rsum[i] 表⽰:[i + 1, n - 1] 区间所有元素的和 int n = nums.length;
 int[] lsum = new int[n];
 int[] rsum = new int[n];
 // 预处理前缀和后缀和数组
 for(int i = 1; i < n; i++)
 lsum[i] = lsum[i - 1] + nums[i - 1];
 for(int i = n - 2; i >= 0; i--)
 rsum[i] = rsum[i + 1] + nums[i + 1];
 // 判断
 for(int i = 0; i < n; i++)
 if(lsum[i] == rsum[i])
 return i;
 return -1;
 }
}

除⾃⾝以外数组的乘积(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。
题⽬数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使⽤除法,且在O(n)时间复杂度内完成此题。
⽰例1:
输⼊:nums=[1,2,3,4]
输出:[24,12,8,6]
⽰例2:
输⼊:nums=[-1,1,0,-3,3]
输出:[0,0,9,0,0]
提⽰:
2<=nums.length<=105
-30<=nums[i]<=30
保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内
进阶:你可以在O(1)的额外空间复杂度内完成这个题⽬吗?(出于对空间复杂度分析的⽬的,输出数组不被视为额外空间。)

讲解算法原理

解法(前缀和数组):
算法思路:
注意题⽬的要求,不能使⽤除法,并且要在 O(N) 的时间复杂度内完成该题。那么我们就不能使⽤暴⼒的解法,以及求出整个数组的乘积,然后除以单个元素的⽅法。
继续分析,根据题意,对于每⼀个位置的最终结果 ret[i] ,它是由两部分组成的:
i. nums[0] * nums[1] * nums[2] * ... * nums[i - 1]
ii. nums[i + 1] * nums[i + 2] * ... * nums[n - 1]
于是,我们可以利⽤前缀和的思想,使⽤两个数组post和suf,分别处理出来两个信息:
i. post表⽰:i位置之前的所有元素,即 [0, i - 1] 区间内所有元素的前缀乘积,ii. suf表⽰:i位置之后的所有元素,即 [i + 1, n - 1] 区间内所有元素的后缀乘积
然后再处理最终结果。

编写代码

c++算法代码:

class Solution
{
public:
 vector<int> productExceptSelf(vector<int>& nums) 
 {
 // lprod 表⽰:[0, i - 1] 区间内所有元素的乘积 // rprod 表⽰:[i + 1, n - 1] 区间内所有元素的乘积 int n = nums.size();
 vector<int> lprod(n + 1), rprod(n + 1);
 lprod[0] = 1, rprod[n - 1] = 1;
 
 // 预处理前缀积以及后缀积
 for(int i = 1; i < n; i++)
 lprod[i] = lprod[i - 1] * nums[i - 1];
 for(int i = n - 2; i >= 0; i--)
 rprod[i] = rprod[i + 1] * nums[i + 1];
 
 // 处理结果数组
 vector<int> ret(n);
 for(int i = 0; i < n; i++)
 ret[i] = lprod[i] * rprod[i];
 return ret;
 }
};

java算法代码:

class Solution {
 public int[] productExceptSelf(int[] nums) {
 // lprod 表⽰:[0, i - 1] 区间内所有元素的乘积 // rprod 表⽰:[i + 1, n - 1] 区间内所有元素的乘积 int n = nums.length;
 int[] lprod = new int[n];
 int[] rprod = new int[n];
 lprod[0] = 1; rprod[n - 1] = 1;
 
 // 预处理前缀积以及后缀积
 for(int i = 1; i < n; i++)
 lprod[i] = lprod[i - 1] * nums[i - 1];
 for(int i = n - 2; i >= 0; i--)
 rprod[i] = rprod[i + 1] * nums[i + 1];
 
 // 处理结果数组
 int[] ret = new int[n];
 for(int i = 0; i < n; i++)
 ret[i] = lprod[i] * rprod[i];
 return ret;
 }
}

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

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

相关文章

Golang | Leetcode Golang题解之第440题字典序的第K小数字

题目&#xff1a; 题解&#xff1a; func getSteps(cur, n int) (steps int) {first, last : cur, curfor first < n {steps min(last, n) - first 1first * 10last last*10 9}return }func findKthNumber(n, k int) int {cur : 1k--for k > 0 {steps : getSteps(cu…

c++11新特性-下

c11的线程库可以跨平台使用。 原子性操作库(atomic) 不需要对原子类型变量进行加锁解锁操作&#xff0c;线程能够对原子类型变量互斥的访问。 atmoic<T> t; // 声明一个类型为T的原子类型变量t 在C11中&#xff0c;原子类 型只能从其模板参数中进行构造&#xff0c;不…

【规控+slam】探索建图方案及代码分享

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言背景建图描述SLAM定位+感知数据标记构建地图自动探索建图规划方法一:手动遥控探索建图算法步骤方法二:手动给定目标点探索建图算法原理方法三:f…

VMware虚拟机连接公网,和WindTerm

一、项目名称 vmware虚拟机连接公网和windterm 二、项目背景 需求1&#xff1a;windows物理机&#xff0c;安装了vmware虚拟机&#xff0c;需要访问公网资源&#xff0c;比如云服务商的yum仓库&#xff0c;国内镜像加速站的容器镜像&#xff0c;http/https资源。 需求2&#xf…

Hive数仓操作(八)

一、Hive中的分桶表 1. 分桶表的概念 分桶表是Hive中一种用于提升查询效率的表类型。分桶指的是根据指定列的哈希值将数据划分到不同的文件&#xff08;桶&#xff09;中。 2. 分桶表的原理 哈希分桶&#xff1a;根据分桶列计算哈希值&#xff0c;对哈希值取模&#xff0c;将…

【漏洞复现】JeecgBoot 积木报表 queryFieldBySql sql注入漏洞

》》》产品描述《《《 积木报表&#xff0c;是一款免费的企业级Web报表工具&#xff0c;像搭建积木一样在线设计报表!功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等! 》》》漏洞描述《《《 JeecgBoot 积木报表 queryFieldBySq| 接口存在一个 SQL 注入漏洞&…

Web和UE5像素流送、通信教程

一、web端配置 首先打开Github地址&#xff1a;https://github.com/EpicGamesExt/PixelStreamingInfrastructure 找到自己虚幻引擎对应版本的项目并下载下来&#xff0c;我这里用的是5.3。 打开项目找到PixelStreamingInfrastructure-master > Frontend > implementat…

NodeJS下载、安装及环境配置教程,内容详实

文章目录 概述关于本文NodeJS介绍 安装步骤 概述 关于本文 本文讲解如何在Windows系统中安装NodeJS并配置相关环境。 NodeJS介绍 Node.js&#xff08;通常简称为Node&#xff09;是一个开源、跨平台的JavaScript运行时环境&#xff0c;它允许开发者在服务器端运行JavaScrip…

【PyTorch】图像分割

图像分割是什么 Image Segmentation 将图像每一个像素分类 图像分割分类 超像素分割&#xff1a;少量超像素代替大量像素&#xff0c;常用于图像预处理语义分割&#xff1a;逐像素分类&#xff0c;无法区分个体实例分割&#xff1a;对个体目标进行分割全景分割&#xff1a;…

Simulink仿真中get_param函数用法

目录 语法 说明 示例 获取模块参数值和模型参数值 获取根参数名称和值 获取模型参数名称和值 获取模块列表和参数值 使用模块句柄获取模块参数值 显示模型中所有模块的模块类型 获取封装参数、Simulink 对象、模块图或注释的选项列表 获取封装参数的计算值 get_para…

如何用TorchAO优化PyTorch模型:看得见的性能提升

你有没有在训练PyTorch模型时,遇到过速度慢、内存占用高的问题?不管你是研究模型优化,还是追求性能极致的开发者,TorchAO可能正是你需要的工具。今天我们来聊聊这个PyTorch原生的架构优化工具,看看它是如何帮助你优化模型的,并且提升整体性能。 TorchAO是什么? Tor…

基于JAVA+SpringBoot+Vue的社区养老服务平台

基于JAVASpringBootVue的社区养老服务平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈…

脸爱云管理系统存在任意文件上传漏洞

漏洞描述 脸爱云一脸通智慧管理平台是一套功能强大、运行稳定、操作简单方便、用户界面美观的一脸通系统。该平台整合了人脸识别技术和智能化解决方案&#xff0c;可以实现识别和管理个体身份&#xff0c;为各种场景提供便捷的身份验证和管理功能。其存在任意文件上传漏洞&…

数值计算的程序设计问题举例

### 数值计算的程序设计问题 #### 1. 结构静力分析计算 **涉及领域**&#xff1a;工程力学、建筑工程 **主要问题**&#xff1a;线性代数方程组&#xff08;Linear Algebraic Equations&#xff09; **解释说明**&#xff1a; 在结构静力分析中&#xff0c;我们需要解决复杂的…

C++第五讲(2):STL--string--string的模拟实现+知识加餐

C第五讲&#xff08;2&#xff09;&#xff1a;STL--string--string的模拟实现知识加餐 1.string的模拟实现1.1string.h头文件 -- string类的声明1.2string.cpp源文件 -- string的具体实现1.3test.cpp源文件 -- string模拟实现的测试 2.知识补充1&#xff1a;swap3.知识补充2&a…

IDEA几大常用AI插件

文章目录 前言列表GPT中文版TalkXBito AIIDEA自带的AI 前言 最近AI、GPT特别火&#xff0c;IDEA里面又有一堆插件支持GPT&#xff0c;所以做个专题比较一下各个GPT插件 列表 先看idea的plugins里支持哪些&#xff0c;搜索“GPT”之后得到的&#xff0c;我用下来感觉第一第二和…

【Iceberg分析】调研Iceberg中表的原地演变

调研Iceberg中表的原地演变 文章目录 调研Iceberg中表的原地演变原生非分区表文件关系图表的原地演变之表schema演变新增字段new_column文件关系变化图为新增字段写入数据文件关系变化图删除新增字段文件关系变化图新增字段new_column2文件关系变化图删除数据文件关系变化图 原…

无人机之数据提取篇

一、无人机平台与传感器 无人机是进行数据采集的基础设施&#xff0c;其稳定性、可靠性、灵活性和负载能力直接影响到数据采集的效果。根据实际需求&#xff0c;需选择适合的无人机类型&#xff0c;如固定翼无人机适合大范围、长时间的数据采集&#xff0c;而多旋翼无人机则更适…

从Fast-UMI到Diff-Control:分别改进UMI的硬件、UMI所用的扩散策略

前言 24年9.28日下午&#xff0c;微信上的好友丁研究员和我说 hi 周总&#xff0c;我们基于umi改进了一下——弄了一个用户友好的采集系统(当然&#xff0c;现在这个版本还比较初级 后续不断迭代)项目网站为&#xff1a;https://fastumi.com/ 技术报告见&#xff1a;https://…

docker和kafka连接Topic失败处理措施

使用 docker 镜像部署一套单节点的 Zookeeper Kafka&#xff0c;但是一直Java却连不上一些处理思路。 为了提高部署效率&#xff0c;这里提供一个简单可启动的docker-compose。 version: "3.3" services:zookeeper:image: zookeeper:3.5.5restart: alwayscontainer…