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、原题链接

LeetCode 6077. 巫师的总力量和

二、解题报告

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]
   ( 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=liik=irio=jkh[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=liik=iri(s[k]s[j1])
   ( 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=lii(s[i]s[j1])+...+(s[ri]s[j1])=h[i]×j=lii(s[i]+...+s[ri])(rii+1)s[j1]
   ( 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=lii(ss[ri]ss[i1])(rii+1)s[j1]
   ( 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 −

以上是关于LeetCode 6077. 巫师的总力量和的主要内容,如果未能解决你的问题,请参考以下文章

leetcode第294场周赛巫师的总力量和——维护前缀和的前缀和

2022-09-05:作为国王的统治者,你有一支巫师军队听你指挥。 :给你一个下标从 0 开始的整数数组 strength , 其中 strength[i] 表示第 i 位巫师的力量值。 对于连续的一

Steam春节特惠马上开启,2077首次打折巫师3新史低价,2077和巫师3的源代码泄露,黑马游戏英灵神殿销量破百万

《楚墓》:穿插讲现代学者和古代巫师的故事,二星

巫师3directx11是啥

MUD教程--巫师入门教程1