day14-前缀和数组

303区域和检索

在这里插入图片描述

这题是太明显的前缀和,直接在初始化的函数中维护sums数组,sums数组(从1开始),的每一个值都是nums数组从第一个到当前位置的所有元素的和

时间复杂度O(N),空间复杂度O(N)

class NumArray {
public:
    vector<int> sums;
    NumArray(vector<int>& nums) {
        int n = nums.size();
        sums.resize(n + 1, 0);//1-n
        for(int i = 0; i < nums.size(); i++){
            sums[i + 1] = sums[i] + nums[i];
        }
    }
    
    int sumRange(int left, int right) {
        return sums[right + 1] - sums[left];
    }
};

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray* obj = new NumArray(nums);
 * int param_1 = obj->sumRange(left,right);
 */

在这里插入图片描述

238除自身之外的数组乘积

在这里插入图片描述

一开始的想法就是计算所有数组的乘积再除以对应元素的值,但是如果遇到数组中有0,就不行了,并且题目中明确说到不能用除法。

想到用前缀和后缀同时维护,再讲对应的相乘就可以返回了

时间复杂度O(N),空间复杂度O(N)

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> left(n , 0);
        vector<int> right(n , 0);
        vector<int> res(n , 0);
        left[0] = 1;//左边无元素,所以第一个数字标为1
        right[n - 1] = 1;//右边无元素,所以最后一个元素标为1
        for(int i = 0; i < n - 1; i++){
            left[i + 1] = nums[i] * left[i];
        } 
        for(int i = n - 1; i > 0; i--){
            right[i - 1] = nums[i] * right[i];
        }

        for(int i = 0; i < nums.size() ; i++){
            res[i] = left[i] * right[i];
        }

        return res;
    }
};

在这里插入图片描述
看了题解发现还有空间复杂度为O(1)的。怎么节省left和right两个数组呢?用结果的res数组代替原来的left数组,然后右边的用一个变量替代,把left先用一个循环计算出来,后面一个循环从后面开始遍历,可以把右边和res数组一起算

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> res(n , 0);//左边的元素累积
        res[0] = 1;
        int right = 1;//右边的元素累积
      
        for(int i = 0; i < n - 1; i++){
            res[i + 1] = res[i] * nums[i];
        } 
        for(int i = n - 1; i >= 0; i--){
            res[i] = res[i] * right;
            right = right * nums[i];
        }

        return res;
    }
};

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值