当前位置: 首页 > article >正文

leetcode刷题日记——除自身以外数组的乘积

[ 题目描述 ]:
在这里插入图片描述
[ 思路 ]:

  • 题目要求获取数组中每个元素除自己以外的各元素的乘积
  • 最简单的方法就是算出数组所有元素的乘积,然后除以自身,即可得到除自身外各元素的乘积
    • 但要考虑到其自身为0的情况,即当期自身为0时,需要重新计算其他各元素乘积
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {int mul=1;int* ans = malloc(numsSize * sizeof(int));for(int i=0;i<numsSize;i++){mul*=nums[i];ans[i]=1;}for(int i=0;i<numsSize;i++){if(nums[i]!=0){ans[i]*=mul/nums[i];}else{for(int j=0;j<numsSize;j++){if(j==i) continue;ans[i]*=nums[j];}}}*returnSize = numsSize;return ans;
}
  • 但题目中要求不使用除法,且在O(n)时间复杂度内完成
    • 不使用除法,即计算当前元素左右两边所有元素的乘积,可以采用双指针向两边遍历求积
    • 时间复杂度为O(n2),超出了时间限制
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {int mul=1;int left=0,right=0;int *ans=(int*)malloc(sizeof(int)*numsSize);for(int i=0;i<numsSize;i++){left=i-1;right=i+1;ans[i]=1;while(left>=0){mul*=nums[left--];}while(right<numsSize){mul*=nums[right++];}ans[i]=mul;mul=1;}*returnSize=numsSize;return ans;
}
  • 如果要在O(n)的时间复杂度内,就需要将左右乘积拿到for循环外面来做,但这样就只能做一次,得不到所有元素的左右乘积。
  • 也就是说如果需要在O(n)的时间复杂度之内,完成,我们得先知道左右两边的乘积,即提前计算并存储
  • 运行如下

在这里插入图片描述

int* productExceptSelf(int* nums, int numsSize, int* returnSize) {int mul=1;int *left=(int*)malloc(sizeof(int)*numsSize);int *right=(int*)malloc(sizeof(int)*numsSize);int *ans=(int*)malloc(sizeof(int)*numsSize);left[0]=1;right[numsSize-1]=1;for(int i=1;i<numsSize;i++){left[i]=left[i-1]*nums[i-1];right[numsSize-1-i]=right[numsSize-i]*nums[numsSize-i];}for(int i=0;i<numsSize;i++){ans[i]=left[i]*right[i];}*returnSize=numsSize;return ans;
}
  • 时间复杂度为O(n),空间复杂度为O(n)

[ 优化 ]:

  • 题目进阶说可以仅使用O(1)的额外空间复杂度完成,但输出数组不算
  • 也就是说用于记录的left,right,ans三个数组,仅有ans可以用
  • 如果直接用ans存储left或者right中的其中一个,另一个又该如何存储
  • 由于空间复杂度为O(1),那就只能是常量right或者表达式right
  • 运行如下

在这里插入图片描述

int* productExceptSelf(int* nums, int numsSize, int* returnSize) {int mul=1;int *ans=(int*)malloc(sizeof(int)*numsSize);ans[0]=1;int right=nums[numsSize-1];for(int i=1;i<numsSize;i++){ans[i]=ans[i-1]*nums[i-1]; }for(int i=numsSize-2;i>=0;i--){ans[i]*=right;right*=nums[i];}*returnSize=numsSize;return ans;
}
  • 时间复杂度O(n),空间复杂度O(n)

[ 官方题解 ]:

  • 一、使用额外空间存储,左右两边乘积,上述第三段代码
  • 二、不使用额外空间,对方法一的优化,上述第四段代码

相关文章:

leetcode刷题日记——除自身以外数组的乘积

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求获取数组中每个元素除自己以外的各元素的乘积最简单的方法就是算出数组所有元素的乘积&#xff0c;然后除以自身&#xff0c;即可得到除自身外各元素的乘积 但要考虑到其自身为0的情况&#xff0c;即当期自身为0时&am…...

【信奥一本通提高篇】基础算法之贪心算法

原文 https://bbs.fmcraft.top/blog/index.php/archives/22/ 贪心算法 概述 近年来的信息学竞赛试题&#xff0c;经常出现求一个问题的可行解或最优解的题目。这类问题就是我们通常所说的最优化问题。贪心算法是求解这类问题的一种常用算法。在众多的算法中&#xff0c;贪心…...

PyQt6实例_批量下载pdf工具_批量pdf网址获取

目录 前置&#xff1a; 步骤&#xff1a; step one 安装包 step two 获取股票代码 step three 敲代码&#xff0c;实现 step four 网址转pdf网址 视频 前置&#xff1a; 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头&#xff0c;放在 【PyQt6实例】 专栏 2 本节讲…...

KMeans算法案例

KMeans算法案例 案例介绍 已知&#xff1a;客户性别、年龄、年收入、消费指数 需求&#xff1a;对客户进行分析&#xff0c;找到业务突破口&#xff0c;寻找黄金客户 数据集共包含顾客的数据, 数据共有 4 个特征, 数据共有 200 条。接下来&#xff0c;使用聚类算法对具有相似…...

IDApro直接 debug STM32 MCU

使用IDA pro 逆向分析muc 固件的时候&#xff0c; 难免要进行一些动态的debug&#xff0c;来进一步搞清楚一些内存的数据、算法等&#xff0c;这时候使用远程debug 的方式直接在mcu上进行debug 最合适不过了。 不过有个前提条件就是一般来说有的mcu 会被运行中的代码屏蔽 RDP、…...

六十天前端强化训练之第三十六天之E2E测试(Cypress)大师级完整指南

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、知识讲解 1. E2E测试核心概念 2. Cypress框架特性 3. 工作原理 4. 测试金字塔定位 二、核心代码示例&#xff1a;用户登录全流程测试 三、实现效果展示 四、学习要…...

创建和管理Pod

创建和管理Pod 文章目录 创建和管理Pod[toc]一、什么是Pod1.Pod 的核心定义2.Pod 的组成与结构3.Pod 的生命周期4.Pod 的使用场景5.高级特性 二、Pod与容器1. 为什么使用 Pod 作为 Kubernetes 的最小部署单元&#xff1f;2. 单一容器 Pod3. 多容器 Pod4. 初始化容器&#xff08…...

20250330-傅里叶级数专题之离散傅里叶变换(5/6)

5. 傅里叶级数专题之离散傅里叶变换 推荐视频: 工科生以最快的速度理解离散傅立叶变换(DFT) 哔哩哔哩 20250328-傅里叶级数专题之数学基础(0/6)-CSDN博客20250330-傅里叶级数专题之傅里叶级数(1/6)-CSDN博客20250330-傅里叶级数专题之傅里叶变换(2/6)-CSDN博客20250330-傅里叶…...

Android设计模式之代理模式

一、定义&#xff1a; 为其他对象提供一种代理以控制对这个对象的访问。 二、角色组成&#xff1a; Subject抽象主题&#xff1a;声明真是主题与代理的共同接口方法&#xff0c;可以是一个抽象类或接口。 RealSubject真实主题&#xff1a;定义了代理表示的真实对象&#xff0c…...

《非暴力沟通》第十二章 “重获生活的热情” 总结

《非暴力沟通》第十二章 “重获生活的热情” 的核心总结&#xff1a; 本章将非暴力沟通的核心理念延伸至生命意义的探索&#xff0c;提出通过觉察与满足内心深处的需要&#xff0c;打破“义务性生存”的桎梏&#xff0c;让生活回归由衷的喜悦与创造。作者强调&#xff0c;当行动…...

3.29:数据结构-绪论线性表-上

一、时间复杂度 1、ADT 2、定义法计算时间复杂度&#xff1a;统计核心语句的总执行次数 &#xff08;1&#xff09;例题1&#xff0c;与2022年的真题对比着写 此题关键在于求和公式的转化&#xff0c;类型为&#xff1a;线性循环嵌套非线性循环 2022年那道题如果考场上实在脑…...

Java项目如何打jar包?

1.java把项目打包成jar 步骤一、IDEA -> File -> Project Structure -> Artifacts -> -> JAR -> From moduls with dependencies... -> 选择 Module 和 Main Class -> 选择 JAR files from libraries JAR files from libraries 解释 extract to the t…...

【奶茶经济学的符号暴力本质】

金字塔式七层分析框架&#xff1a;奶茶经济学的符号暴力本质 第一层&#xff1a;缺货的戏剧经济学 结论&#xff1a;13.7%缺货率是精密计算的神经钩 机制&#xff1a;喜茶新品首日仅投放86.3%门店&#xff0c;制造"限量焦虑"激活前额叶决策区矛盾验证&#xff1a; …...

Python PDF解析利器:pdfplumber | AI应用开发

Python PDF解析利器&#xff1a;pdfplumber全面指南 1. 简介与安装 1.1 pdfplumber概述 pdfplumber是一个Python库&#xff0c;专门用于从PDF文件中提取文本、表格和其他信息。相比其他PDF处理库&#xff0c;pdfplumber提供了更直观的API和更精确的文本定位能力。 主要特点…...

大模型架构记录13【hr agent】

一 Function calling 函数调用 from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from openai import OpenAI import jsonclient OpenAI()# Example dummy function hard coded to return the same weather # In production, this could be your back…...

conda 清除 tarballs 减少磁盘占用 、 conda rename 重命名环境、conda create -n qwen --clone 当前环境

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 conda clean --tarballsconda rename 重命名环境conda create -n qwen --clone …...

Java基础-24-继承-认识继承-权限修饰符-继承的特点

在Java中&#xff0c;继承是面向对象编程&#xff08;OOP&#xff09;的一个重要特性。通过继承&#xff0c;一个类可以复用另一个类的属性和方法&#xff0c;从而实现代码的重用性和扩展性。以下是关于继承的一些关键点&#xff0c;包括权限修饰符和继承的特点。 1. 继承的基本…...

Bootstrap 表格:高效布局与动态交互的实践指南

Bootstrap 表格:高效布局与动态交互的实践指南 引言 Bootstrap 是一个流行的前端框架,它为开发者提供了丰富的组件和工具,使得构建响应式、美观且功能丰富的网页变得更加简单。表格是网页中常见的元素,用于展示数据。Bootstrap 提供了强大的表格组件,可以帮助开发者轻松…...

pycharm相对路径引用方法

用于打字不方便&#xff0c;以下直接手写放图&#xff0c;直观理解...

新能源智慧灯杆的智能照明系统如何实现节能?

叁仟新能源智慧灯杆的智能照明系统可通过以下多种方式实现节能&#xff1a; 智能调光控制 光传感器技术&#xff1a;在灯杆上安装光传感器&#xff0c;实时监测周围环境的光照强度。当环境光线充足时&#xff0c;如白天或有其他强光源时&#xff0c;智能照明系统会自动降低路…...

Jenkins教程(自动化部署)

Jenkins教程(自动化部署) 1. Jenkins是什么&#xff1f; Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;广泛用于项目开发&#xff0c;具有自动化构建、测试和部署等功能。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&…...

行业智能体大爆发,分布式智能云有解

Manus的一夜爆红&#xff0c;在全球范围内引爆关于AI智能体的讨论。 与过去一般的AI助手不同&#xff0c;智能体&#xff08;AI Agent&#xff09;并非只是被动响应&#xff0c;而是主动感知、决策并执行的应用。Gartner预测&#xff0c;到2028年&#xff0c;15%的日常工作决策…...

日语Learn,英语再认识(5)

This is a dedicated function — it exists solely to solve this case. This is a dedicated function. It’s a dedicated method for solving this case. 其他备选词&#xff08;但没dedicated精准&#xff09;&#xff1a; special → 含糊&#xff0c;有时只是“特别”…...

【区块链安全 | 第十四篇】类型之值类型(一)

文章目录 值类型布尔值整数运算符取模运算指数运算 定点数地址&#xff08;Address&#xff09;类型转换地址的成员balance 和 transfersendcall&#xff0c;delegatecall 和 staticcallcode 和 codehash 合约类型&#xff08;Contract Types&#xff09;固定大小字节数组&…...

音视频入门基础:MPEG2-TS专题(25)——通过FFmpeg命令使用UDP发送TS流

一、通过FFmpeg命令使用UDP发送TS流 通过以下FFmpeg命令可以将一个mp4文件转换为ts封装&#xff0c;并基于UDP发送&#xff08;推流&#xff09;&#xff1a; ffmpeg.exe -re -i input.mp4 -vcodec copy -acodec copy -f mpegts udp://127.0.0.1:1234 其中&#xff1a; “in…...

Error in torch with streamlit

报错信息: This is the error which is a conflict between torch and streamlit: Examining the path of torch.classes raised: Tried to instantiate class path.path’, but it does not exist! Ensure that it is registered via torch::class Steps to reproduce: py…...

网络基础知识介绍

目录 一、计算机网络背景与发展 1.1 计算机网络的背景 ​编辑1.2 计算机网络的发展历程 二、网络协议 2.1 认识网络协议 2.3 协议分层 2.4 OSI七层模型 2.5 TCP/IP 五层(或四层)模型 三、网络传输基本流程 3.1 网络传输流…...

MIPS-32架构(寄存器堆,指令系统,运算器)

文章目录 0 Preview:寄存器32通用0 $zero1 $at2—3 \$v0-$v14—7 \$a0-$a38—15 \$t0-$t716—23 \$s0-$s724—25 \$t8-$t926—27 \$k0-$k128 $gp29 $sp30 $fp 指令系统运算存储器 0 Preview: MIPS架构有32位版本和64位版本&#xff0c;本文介绍32位版本 寄存器 正如笔者曾说…...

zip和tar.gz

本文来源&#xff1a; 在压缩文件格式选择上&#xff0c;zip和tar.gz有本质差异&#xff0c;主要体现在以下五个方面&#xff1a; 一、压缩机制不同 ​tar.gz是"两步走"方案&#xff1a;先用tar工具将多个文件/目录打包为单个未压缩的归档文件&#xff08;保留权限…...

【什么是机器学习——多项式逼近】

什么是机器学习——多项式逼近 机器学习可以分成三大类别,监督学习、非监督学习、强化学习。三大类别背后的数学原理不同。监督学习使用了数学分析中的函数逼近方法和概率统计中的极大似然方法;非监督学习使用聚类和EM算法;强化学习使用马尔可夫决策过程的想法。 机器学习的…...