LeetCode 6077. 巫师的总力量和
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 6077. 巫师的总力量和相关的知识,希望对你有一定的参考价值。
文章目录
一、题目
1、题目描述
作为国王的统治者,你有一支巫师军队听你指挥。给你一个下标从 0 开始的整数数组
strength
,其中strength[i]
表示第i
位巫师的力量值。对于连续的一组巫师(也就是这些巫师的力量值是strength
的 子数组),总力量 定义为以下两个值的 乘积 :
巫师中 最弱 的能力值。
组中所有巫师的个人力量值 之和。
请你返回 所有巫师组的总力量之和。由于答案可能很大,请将答案对 1 0 9 + 7 10^9+7 109+7 取余 后返回。
样例输入:strength = [1,3,1,2]
样例输出:44
2、基础框架
- C++ 版本给出的基础框架代码如下:
class Solution
public:
int totalStrength(vector<int>& strength)
;
3、原题链接
二、解题报告
1、思路分析
(
1
)
(1)
(1) 恶心!一看到题目,就知道一定又是
1
0
5
10^5
105,所以
O
(
n
2
)
O(n^2)
O(n2) 是肯定过不了的。
(
2
)
(2)
(2) 将样例的数据抽象成二维的直方图,数据的值代表高度。
(
3
)
(3)
(3) 如果枚举任意一块直方图
i
i
i,以它为最低点,找左边能够到达的最远边界,以及右边能够到达的最远边界,左边界定义为
l
i
l_i
li,右边界定义为
r
i
r_i
ri
(
4
)
(4)
(4) 接下来问题就转换成在
[
l
i
,
i
]
[l_i, i]
[li,i] 找一个下标
j
j
j,并且在
[
i
,
r
i
]
[i, r_i]
[i,ri] 找一个下标
k
k
k,并且求
∑
o
=
j
k
h
[
o
]
\\sum_o=j^k h[o]
∑o=jkh[o]。 以上是关于LeetCode 6077. 巫师的总力量和的主要内容,如果未能解决你的问题,请参考以下文章 leetcode第294场周赛巫师的总力量和——维护前缀和的前缀和 2022-09-05:作为国王的统治者,你有一支巫师军队听你指挥。 :给你一个下标从 0 开始的整数数组 strength , 其中 strength[i] 表示第 i 位巫师的力量值。 对于连续的一
(
5
)
(5)
(5) 于是,对于第
i
i
i 个直方图,以它为最低点,得到的力量值应该就是
h
[
i
]
×
∑
j
=
l
i
i
∑
k
=
i
r
i
∑
o
=
j
k
h
[
o
]
h[i] \\times \\sum_j=l_i^i \\sum_k=i^r_i\\sum_o=j^k h[o]
h[i]×j=li∑ik=i∑rio=j∑kh[o]
(
6
)
(6)
(6) 如果我们知道
h
[
i
]
h[i]
h[i] 的前缀和
s
[
i
]
s[i]
s[i],就可以将第三个循环优化掉,如下:
h
[
i
]
×
∑
j
=
l
i
i
∑
k
=
i
r
i
(
s
[
k
]
−
s
[
j
−
1
]
)
h[i] \\times \\sum_j=l_i^i \\sum_k=i^r_i (s[k] - s[j-1])
h[i]×j=li∑ik=i∑ri(s[k]−s[j−1])
(
7
)
(7)
(7) 假设
j
j
j 为常量,则将最内层的求和进行展开,得到:
=
h
[
i
]
×
∑
j
=
l
i
i
(
s
[
i
]
−
s
[
j
−
1
]
)
+
.
.
.
+
(
s
[
r
i
]
−
s
[
j
−
1
]
)
=
h
[
i
]
×
∑
j
=
l
i
i
(
s
[
i
]
+
.
.
.
+
s
[
r
i
]
)
−
(
r
i
−
i
+
1
)
s
[
j
−
1
]
\\beginaligned &= h[i] \\times \\sum_j=l_i^i (s[i] - s[j-1]) + ... + (s[r_i] - s[j-1]) \\\\ &= h[i] \\times \\sum_j=l_i^i (s[i]+...+s[r_i] )- (r_i-i+1) s[j-1]\\endaligned
=h[i]×j=li∑i(s[i]−s[j−1])+...+(s[ri]−s[j−1])=h[i]×j=li∑i(s[i]+...+s[ri])−(ri−i+1)s[j−1]
(
8
)
(8)
(8) 如果我们知道
s
[
i
]
s[i]
s[i] 的前缀和
s
s
[
i
]
ss[i]
ss[i],就可以将上述的求和优化掉,如下:
h
[
i
]
×
∑
j
=
l
i
i
(
s
s
[
r
i
]
−
s
s
[
i
−
1
]
)
−
(
r
i
−
i
+
1
)
s
[
j
−
1
]
h[i] \\times \\sum_j=l_i^i (ss[r_i] - ss[i-1]) - (r_i-i+1) s[j-1]
h[i]×j=li∑i(ss[ri]−ss[i−1])−(ri−i+1)s[j−1]
(
9
)
(9)
(9) 如果这样计算,枚举
i
i
i 和
j
j
j,最坏时间复杂度是
O
(
n
2
)
O(n^2)
O(n2),于是,我们而已考虑假设
k
k
k 作为常量的情况,得到如下等式:
=
h
[
i
]
×
∑
j
=
l
i
i
∑
k
=
i
r
i
(
s
[
k
]
−
s
[
j
−
1
]
)
=
h
[
i
]
×
∑
k
=
i
r
i
(
s
[
k
]
−
s
[
l
i
−
1
]
)
+
.
.
.
+
(
s
[
k
]
−
s
[
i
−
1
]
)
=
h
[
i
]
×
∑
k
=
i
r
i
(
i
−
l
i
+
1
)
s
[
k
]
−
(
s
[
l
i
−
1
]
+
.
.
.
+
s
[
i
−