leet-code 303.区域和搜索-数组不可变

9 篇文章 0 订阅
6 篇文章 0 订阅

给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
示例:
给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()

sumRange(0, 2) -> 1 
sumRange(2, 5) -> -1 
sumRange(0, 5) -> -3 

说明:

你可以假设数组不可变。 会多次调用 sumRange 方法。

思路: 此题一看,第一反应就是线段树,但是,由于数组不可变,那么用数组解决更为方便快速,开一个数组,将前n个元素的和记录在数组中,数组的长度需要比元素个数多一,用于储存前0个元素的和这个值
,然后用前n个sum相减,就能得到两个sum之间的区间的值

package SegmentTree;


/**
 * @author BestQiang
 * leet-code 303.区域和搜索-数组不可变
 */
public class NumArray {

       private int[] sum; // sum[i]储存前i个元素和, sum[0] = 0   sum[i]储存nums[0...i-1]的和
    public NumArray2(int[] nums) {
        // 因为有计算前零个nums元素的长度,所以声明sum数组的长度为nums的长度加一
        sum = new int[nums.length + 1];
        // 要记录sum[0],因为这也是一个区间
        sum[0] = 0;
        // 对sum数组的值进行遍历赋值
        for(int i = 1; i < sum.length; i ++) {
            // 就如此时sum[1]对应的元素和是nums[0],因为sum[0]被占了,这个意思懂吧,所以推导到下面的公式
            sum[i] = sum[i - 1] + nums[i - 1];
        }
    }


    // 求i到j区间的和,注意是闭区间
    public int sumRange(int i, int j) {
        return sum[j + 1] - sum[i];
    }
}
探险家小扣的行动轨迹,都将保存在记录仪中。expeditions[i] 表示小扣第 i 次探险记录,用一个字符串数组表示。其中的每个「营地」由大小写字母组成,通过子串 -> 连接。例:"Leet->code->Campsite",表示到访了 "Leet"、"code"、"Campsite" 三个营地。expeditions[0] 包含了初始小扣已知的所有营地;对于之后的第 i 次探险(即 expeditions[i] 且 i > 0),如果记录中包含了之前均没出现的营地,则表示小扣 新发现 的营地。 请你找出小扣发现新营地最多且索引最小的那次探险,并返回对应的记录索引。如果所有探险记录都没有发现新的营地,返回 -1。注意: 大小写不同的营地视为不同的营地; 营地的名称长度均大于 0。用python实现。给你几个例子:示例 1: 输入:expeditions = ["leet->code","leet->code->Campsite->Leet","leet->code->leet->courier"] 输出:1 解释: 初始已知的所有营地为 "leet" 和 "code" 第 1 次,到访了 "leet"、"code"、"Campsite"、"Leet",新发现营地 2 处:"Campsite"、"Leet" 第 2 次,到访了 "leet"、"code"、"courier",新发现营地 1 处:"courier" 第 1 次探险发现的新营地数量最多,因此返回 1。示例 2: 输入:expeditions = ["Alice->Dex","","Dex"] 输出:-1 解释: 初始已知的所有营地为 "Alice" 和 "Dex" 第 1 次,未到访任何营地; 第 2 次,到访了 "Dex",未新发现营地; 因为两次探险均未发现新的营地,返回 -1
最新发布
04-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hermione Granger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值