【优选算法必刷100题】第027~28题(前缀和算法):寻找数组的中心下标、除自身以外数组的乘积

【优选算法必刷100题】第027~28题(前缀和算法):寻找数组的中心下标、除自身以外数组的乘积

🔥艾莉丝努力练剑:个人主页

专栏传送门:《C语言》《数据结构与算法》C/C++干货分享&学习过程记录Linux操作系统编程详解笔试/面试常见算法:从基础到进阶

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬艾莉丝的简介:



🎬艾莉丝的算法专栏简介:


目录

​027  寻找数组的中心下标

 1.1  算法思路:前缀和

1.2  算法实现

1.2.1  C++实现

1.2.2  Java实现

1.3  博主手记

​028  除自身以外数组的乘积

2.1  算法思路

2.2  算法实现

2.2.1  C++实现

2.2.2  Java实现

2.3  博主手记

结尾


027  寻找数组的中心下标

力扣链接:724. 寻找数组的中心下标

力扣题解链接:前缀和优化法解决【寻找数组的中心下标】问题

题目描述:

 

1.1  算法思路:前缀和

我们根据中心下标的定义可知:除中心下标的元素外,该元素左边的前缀和】等于该元素右边的【后缀和】——

(1)因此,我们可以先预处理出来两个数组,一个表示前缀和,另一个表示后缀和。
(2)然后,我们可以用一个for循环枚举可能的中心下标,判断每一个位置的「前缀和」以及【后缀和】,如果二者相等,就返回当前下标。

1.2  算法实现

1.2.1  C++实现

代码演示如下——

class Solution { public: int pivotIndex(vector<int>& nums) { // 数组大小 int n = nums.size(); vector<int> f(n),g(n); // // 细节处理 // int f[0] = 0,g[n - 1] = 0; // 1、预处理前缀和数组和后缀和数组 for(int i = 1;i < n;i++) // f[0] = 0,如果i = 0开始会发生越界访问 f[i] = f[i - 1] + nums[i - 1]; for(int i = n - 2;i >= 0;i--) g[i] = g[i + 1] + nums[i + 1]; // 2、使用 for(int i = 0;i < n;i++) if(f[i] == g[i]) return i; return -1; } };
时间复杂度:O(n),空间复杂度:O(1)。

 

1.2.2  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; } }
时间复杂度:O(n),空间复杂度:O(1)。  

 

1.3  博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!

 


​028  除自身以外数组的乘积

力扣链接:238. 除自身以外数组的乘积

力扣题解链接:前缀后缀乘积法解决【除自身以外数组的乘积】

题目描述:

 

2.1  算法思路

注意题目的要求,不能使用除法,并且要在O(N)的时间复杂度内完成该题。那么我们就不能使
用暴力的解法,以及求出整个数组的乘积,然后除以单个元素的方法。
继续分析,根据题意,对于每一个位置的最终结果ret[i],它是由两部分组成的:

(1)nums[0] * nums[1] * nums[2] *  ...  *nums[i - 1]
(2)nums[i + 1] * nums[i + 2] * ... * nums[n - 1]

于是,我们可以利用前缀和的思想,使用两个数组post和suf,分别处理出来两个信息:

(1)post表示:i位置之前的所有元素,即[0,i - 1]区间内所有元素的前缀乘积;
(2)suf表示:i位置之后的所有元素,即[i + 1,n - 1]区间内所有元素的后缀乘积然后再处理最终结果。

2.2  算法实现

2.2.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; } };
时间复杂度:O(n),空间复杂度:O(1)。

2.2.2  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; } }
时间复杂度:O(n),空间复杂度:O(1)。

2.3  博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!


结尾

往期回顾:

【优选算法必刷100题】第025~26题(前缀和算法):【模版】前缀和、【模板】二维前缀和

结语:都看到这里啦!请大佬不要忘记给博主来个“一键四连”哦!

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡

૮₍ ˶ ˊ ᴥ ˋ˶₎ა


Read more

如何在Llama-Factory中启用梯度裁剪保护训练稳定性?

如何在 Llama-Factory 中启用梯度裁剪保护训练稳定性 在大模型微调日益普及的今天,一个看似不起眼的配置项,往往能决定整个训练任务是平稳收敛还是中途崩溃。比如你正用 Qwen-7B 做对话微调,学习率设得稍高一点,batch size 又受限于显存不得不压小——结果前几步 loss 还好好的,突然跳成 NaN,重启几次都一样。这时候,问题很可能不在于数据或模型结构,而在于缺少一道关键的“安全阀”:梯度裁剪。 这并不是什么神秘技术,但它的作用堪称救命稻草。尤其是在 Llama-Factory 这类集成化框架中,正确启用梯度裁剪几乎是以最小代价换取最大稳定性的首选策略。 Transformer 架构的深层网络对梯度异常极为敏感,尤其是注意力机制中某些头可能会在特定输入下产生剧烈响应,导致局部梯度激增。这些“尖峰”梯度一旦参与参数更新,就可能把好不容易学来的知识冲垮。更糟的是,在 LoRA 或 QLoRA 这种仅微调少量参数的场景中,适配层的参数空间更小、更新更集中,反而更容易因梯度过大致使权重震荡甚至溢出。 那怎么办?降低学习率当然可以缓解,但代价是收敛变慢;

告别字幕制作烦恼:N46Whisper让日语视频字幕轻松搞定

告别字幕制作烦恼:N46Whisper让日语视频字幕轻松搞定 【免费下载链接】N46WhisperWhisper based Japanese subtitle generator 项目地址: https://gitcode.com/gh_mirrors/n4/N46Whisper 你是否也曾遇到这样的情况:喜欢的日语视频没有字幕,听不懂又看不明?或者想制作双语字幕分享给朋友,却被复杂的软件和漫长的处理过程劝退?现在,有了N46Whisper,这些问题都将成为过去!这款基于AI技术的字幕生成工具,就像你的私人字幕助理,让你轻松拥有专业级字幕效果。 为什么选择N46Whisper?三大核心优势告诉你 无需安装,打开就能用 传统字幕软件往往需要复杂的安装和配置过程,而N46Whisper采用云端处理方式,就像使用在线文档一样简单。你只需要一个浏览器,就能随时随地开始制作字幕,省去了安装软件的麻烦,特别适合电脑小白和追求效率的用户。 AI助力,识别精准又快速 N46Whisper背后有强大的AI引擎作为支撑,它就像一个经验丰富的日语听力专家,能够准确捕捉视频中的语音内容。无论

本地部署AI绘画就这么简单,麦橘超然实操笔记

本地部署AI绘画就这么简单,麦橘超然实操笔记 1. 开门见山:不用折腾显卡,8GB显存也能跑出专业级画质 你是不是也试过下载一堆AI绘画工具,结果刚点开就弹出“CUDA out of memory”?或者被复杂的环境配置、模型下载、依赖冲突搞得头大,最后连第一张图都没生成出来?别急,这次真不一样。 麦橘超然 - Flux 离线图像生成控制台,不是又一个需要你手动编译、调参、查报错的实验项目。它是一套开箱即用、专为中低显存设备打磨的完整方案——模型已打包进镜像,代码已写好,连端口转发都给你配好了命令行模板。你只需要三步:复制脚本、运行命令、打开浏览器,就能在自己的电脑或远程服务器上,亲手生成一张赛博朋克雨夜街景。 它背后用的是当前图像生成领域最前沿的 Flux.1 架构,但做了关键改造:DiT主干网络用 float8 量化压缩,文本编码器和VAE保持高保真精度,再配合 CPU 卸载机制,把原本动辄12GB显存的模型,硬生生压进6–

昔日AI绘画框架王者Stable Diffusion WebUI,已死

昔日AI绘画框架王者Stable Diffusion WebUI,已死

写在前面 【WeThinkIn出品】栏目分享Rocky的认知思考与经验感悟,范围涵盖但不限于AI行业。 欢迎大家关注Rocky的公众号:WeThinkIn 欢迎大家关注Rocky的知乎:Rocky Ding AIGC算法工程师面试面经秘籍分享:WeThinkIn/Interview-for-Algorithm-Engineer欢迎大家Star~ 获取更多AI行业的前沿资讯与干货资源 AIGC时代的 《三年面试五年模拟》AI算法工程师求职面试秘籍独家资源:【三年面试五年模拟】AI算法工程师面试秘籍 Rocky最新撰写10万字Stable Diffusion 3和FLUX.1系列模型的深入浅出全维度解析文章:深入浅出完整解析Stable Diffusion 3(SD 3)和FLUX.1系列核心基础知识 AIGC算法岗/开发岗面试面经交流社群(涵盖AI绘画、AI视频、大模型、AI多模态、数字人等AIGC面试干货资源)欢迎大家加入:https://t.zsxq.com/33pJ0 大家好,我是Rocky。 “还记得我们第一次打开Stable Diffusion WebUI,用上第