做二手房需要用到哪些网站搜集房源,wordpress 按钮特效,一个网站的设计周期,提供东莞网站制作公司文章目录 写在前面Tag题目来源题目解读解题思路方法一#xff1a;记录左右乘积空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法#xff0c;两到三天更新一篇文章#xff0c;欢迎催更…… 专栏内容以分析题目为主#xff0c;并附带一些对于本题涉及到… 文章目录 写在前面Tag题目来源题目解读解题思路方法一记录左右乘积空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法两到三天更新一篇文章欢迎催更…… 专栏内容以分析题目为主并附带一些对于本题涉及到的数据结构等内容进行回顾与总结文章结构大致如下部分内容会有增删 Tag介绍本题牵涉到的知识点、数据结构题目来源贴上题目的链接方便大家查找题目并完成练习题目解读复述题目确保自己真的理解题目意思并强调一些题目重点信息解题思路介绍一些解题思路每种解题思路包括思路讲解、实现代码以及复杂度分析知识回忆针对今天介绍的题目中的重点内容、数据结构进行回顾总结。 Tag
【数组】 题目来源
面试经典150 | 238. 除自身以外数组的乘积 题目解读
给你一个数组 nums求出每个元素在数组这个集合中补集的乘积以数组的形式返回答案。
要求不准使用除法。 解题思路
题目要求不准使用除法如果可以使用除的话我们可以计算数组中所有元素的乘积然后除以相应的数值即可得到答案数组。
既然不能使用除法我们就老老实实的乘将每个数左右两侧的数一个一个的乘起来但是如果不做预处理的话时间复杂度为 O ( n 2 ) O(n^2) O(n2)对于本题的数据量一定超时因此可以先记录每个位置左、右侧的元素乘积。
方法一记录左右乘积
我们维护两个数组 L、R 分别记录每个位置左、右侧的所有元素乘积。具体地L[i] 表示下标 i 左侧所有元素之积初始 L[0] 1R[i] 表示下标 i 右侧所有元素之积初始 R[n-1] 1 n n n 为数组 nums 的长度
枚举 i 1 到 i n-1更新 L[i] nums[i-1] * L[i-1]枚举 i n-2 到 i 1更新 R[i] nums[i1] * R[i1]。
最后枚举 i 0 到 i n-1更新 ret[i] L[i] * R[i]返回 ret。
实现代码
class Solution {
public:vectorint productExceptSelf(vectorint nums) {int n nums.size();vectorint L(n, 0), R(n, 0);L[0] 1;for (int i 1; i n; i) {L[i] nums[i-1] * L[i-1];}R[n-1] 1;for (int i n -2; i 0; --i) {R[i] R[i1] * nums[i1];}vectorint res(n);for (int i 0; i n; i) {res[i] L[i] * R[i];}return res;}
};复杂度分析
时间复杂度 O ( n ) O(n) O(n) n n n 为数组 nums 的长度。
空间复杂度 O ( n ) O(n) O(n)。
空间优化
有一个地方可以优化一下我们只用一个数组 ret 记作为答案数组又做为记录每个位置左侧所有元素乘积的数组。
还是 枚举 i 1 到 i n-1更新 ret[i] nums[i-1] * ret[i-1]接下来用一个变量 R 来记录当前位置后面所有元素的乘积初始化 R 1。我们从后往前更新最后的答案数组ret[i] * R然后对 R 进行更新 R * nums[i]。
这样可以节省一个数组空间。
实现代码
class Solution {
public:vectorint productExceptSelf(vectorint nums) {int n nums.size();vectorint ret(n);ret[0] 1;for (int i 1; i n; i) {ret[i] nums[i-1] * ret[i-1];}int R 1;for (int i n-1; i 0; --i) {ret[i] * R;R * nums[i];}return ret;}
};复杂度分析
时间复杂度 O ( n ) O(n) O(n) n n n 为数组 nums 的长度。
空间复杂度 O ( 1 ) O(1) O(1)使用的答案数组不算做额外的空间。 写在最后
如果文章内容有任何错误或者您对文章有任何疑问欢迎私信博主或者在评论区指出 。
如果大家有更优的时间、空间复杂度方法欢迎评论区交流。
最后感谢您的阅读如果感到有所收获的话可以给博主点一个 哦。