数据结构-线性表(数组)-前缀和入门 724. 寻找数组的中心下标 && 1588. 所有奇数长度子数组的和 &&303. 区域和检索 - 数组不可变

724. 寻找数组的中心下标

  • 解题思路
    枚举数组中每个元素,计算左边和右边是否相等,相等则返回下标。

  • 代码

    int pivotIndex(vector<int>& nums) {
            int len = nums.size();
            //1
            int sum[len];
            for(int i = 0;i<len;++i){
                sum[i] = nums[i];
                if(i){
                    sum[i] += sum[i-1];
                }
            }
            //2
            if(sum[len-1]-sum[0] == 0) return 0;
            //3
            for(int j = 1;j<len;++j){
                if(sum[j-1]==sum[len-1]-sum[j]) return j;
            }
            return -1;
        }
    

第一部分,先用一个数组把当前元素的前缀和保存起来;第二部分处理特殊情况->当元素下标为零的时候;第三部分是处理下标为一以后的元素,如果有则直接返回。

  • 总结学习
    前缀和数组来保存原数组中对应元素的前缀和
    1588. 所有奇数长度子数组的和
  1. 暴力解法
class Solution {
public:
    int sumOddLengthSubarrays(vector<int>& arr) {
        int len = arr.size();
        int i = 1;
        int temp = 0;
        int sum = 0;
        while(i<=len){
            for(int j = 0; j <= len-i; ++j){
                for(int k = j; k < j+i; ++k){
                    temp += arr[k];
                }
            }
            sum += temp;
            temp = 0;
            i = i+2;
        }
        return sum;
    }
};
  1. 根据统计学理论,元素 i 左边子数组长度的可能情况和右边子数组长的的可能情况,因为是奇数子数组,所以左右奇偶性应该相同,相乘相加后就是元素 i 出现的次数。
int sumOddLengthSubarrays(vector<int>& arr) {
        int len = arr.size();
        int sum = 0;
        int left,right;
        int left_even,left_add,right_even,right_add;
        for(int i = 0; i < len; ++i){
            left = i + 1;
            right = len - i;
            left_even = (left+1)/2;
            left_add = left/2;
            right_even = (right+1)/2;
            right_add = right/2;
            
            sum += arr[i]*(left_add*right_add + left_even*right_even);
        }
        return sum;
    }

303. 区域和检索 - 数组不可变

	class NumArray {
	public:
	vector<int> sum;
	    NumArray(vector<int>& nums) {
	        int len = nums.size();
	        sum.reszie(len+1,0);
	        sum[1] = nums[1];
	        for(int i = 1;i<len;++i){
	            sum[i] = sum[i-1] + nums[i];
	        }
	    }
	    
	    int sumRange(int left, int right) {
	        
	    }
	};
	```
	 - 总结
 前缀和数组有两种:
 一种是前缀和数组表示原数组中当前元素前的元素和 需要比原数组长度加1303. 区域和检索 - 数组不可变就是这种情况
 另一种是前缀和数组表示原数组中包含当前元素的元素和。 724. 寻找数组的中心下标 题解就是这种情况
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值