leetcode 2055

public static int[] platesBetweenCandles(String s, int[][] queries) {
        int n = s.length();
        //sum前缀和数组用来快速求解
        int[] sums = new int[n];
        //last数组是为了找到大于等于当前位置的 |  的位置,因为要用前缀和数组求解,所以需要知道start之后的第一个|位置
        //在求解sum数组的时候就是按照 end位置的前一个  |  的位置求出来的前缀和数组,所以end不需要处理
        int[] last = new int[n];
        int pre = 0;
        //找到第一个 |  位置
        for (int i = 0; i < n; i++) {
            if (s.charAt(i) == '|') {
                pre = i;
                //这里需要把 | 位置的last[pre] 设置成自己,
                last[i] = i;
                break;
            }
            last[i] = 0;
        }
        //求解sum数组
        for (int i = pre+1; i < n; i++) {
            if (s.charAt(i) == '|') {
                //求解个数
                sums[i] = sums[i - 1] + i - 1 - pre;
                //设置pre+1  ---> 当前位置 的last设置成当前位置,因为从pre+1 到当前位置作为start的时候因为没| 所以就和从当前位置开始是一样的
                for (int j = pre+1; j <= i; j++) {
                    last[j] = i;
                }
                //重置pre数值
                pre = i;
            } else {
                //sum数组更新,没碰到 | 就和上一个一样
                sums[i] = sums[i - 1];
            }
        }
        //因为最后可能后面几个 * 最后一个没有 | 要设置成 n或者比n大的数,后面在 - 的时候就会默认设置成0了
        for (int i = pre; i < n; i++) {
            last[i] = n;
        }
        int[] res = new int[queries.length];
        for (int i = 0; i < queries.length; i++) {
            //如果start 的后面一个 | 位置比end大,那就没必要算了,没有,设置成0
            if (last[queries[i][0]] >= queries[i][1]) {
                res[i] = 0;
            } else {
                //比end小,可以一算
                res[i] = sums[queries[i][1]] - sums[last[queries[i][0]]];
            }
        }
        return res;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值