LeetCode238. 除自身以外数组的乘积

//238. 除自身以外数组的乘积
/*
 * 1、暴力做法
 * 创建两个数组,一个用于记录前缀乘积,一个记录后缀乘积
 * 最后直接将两个数组对应的数字乘起来就是答案
 * 时间:3n -> n
 * 解释:记录前缀和后缀分别需要 n
 *      遍历每个节点又需要 n
 *      加起来就是 3*n
 * 空间:2n -> n
 * 解释:除了返回的数组,多用了两个具有n个元素的数组
 *      所以是 2*n
 */
class Solution {
public:
  vector<int> productExceptSelf(vector<int>& nums) {
    int n = nums.size();
    vector<int>l(n, 1);
    vector<int>r(n, 1);
    for (int i = 1; i < n; i++) {
      l[i] = l[i - 1] * nums[i - 1];
    }
    for (int i = n - 2; i >= 0; i--) {
      r[i] = r[i + 1] * nums[i + 1];
    }
    vector<int>ans;
    for (int i = 0; i < n; i++) {
      ans.emplace_back(l[i] * r[i]);
    }
    return ans;
  }
};
/*
 * 2、常数空间
 * 创建新数组当做返回的答案数组
 * 从头开始,遍历第一遍,将答案数组变成前缀数组
 * 从尾开始,遍历第二遍,直接在前缀数组的基础上,乘上后缀数组。
 * 返回答案数组
 * 时间:2*n -> n
 * 解释:只遍历了两遍
 * 空间:常数
 * 解释:只新建了一个答案数组
 */
/*
 * 这种方法其实也可以放在一起
 * 只使用一个for循环,循环里面同时处理两端的数据
 * 但是直接看这种代码的话,不好理解
 * 所以把它分开了,其实时间、空间复杂度还有思路都是一样的。
 */
class Solution {
public:
  vector<int> productExceptSelf(vector<int>& nums) {
    int n = nums.size();
    vector<int>ans(n, 1);
    int t = 1;
    for (int i = 0; i < n; i++) {
      ans[i] *= t;
      t *= nums[i];
    }
    t = 1;
    for (int i = n - 1; i >= 0; i--) {
      ans[i] *= t;
      t *= nums[i];
    }
    return ans;
  }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值