当前位置: 首页 > news >正文

力扣第 104 场双周赛 2681. 英雄的力量

原题链接力扣

 题目大意:我开始看成连续子段了,写了个递归程序....... 

一个数组任选一个子序列,子序列的力量值=最大值平方*最小值。求所有子序列的力量和。

分析过程:如序列长度为n,子序列总数为2的n次幂,显然不可能枚举所有子序列来求解。那么只能锁定子序列最大值和最小值来处理。容易想到先排序,排序后的序列可以取任意ai和aj,那么ai最小值,aj 最大值,i和j之间的元素可以任取,例如i=2,j=6,那么i和j之间有3个其他元素,这3个元素可以任取,因此共有2的3次幂共8种选取方法:(a2,a6) (a2,a3,a6) (a2,a4,a6) (a2,a5,a6)(a2,a3,a4,a6).......。枚举所有i和j,时间复杂度为O(n2)。

这类问题如何继续降低复杂度。一般来说都会存在某种规律,使得下一次的处理能利用上一次的结果,也有写问题存在某种(数学)方法,能直接求得解。本题目通过找规律解决。

假设a1为最小值,那么子序列中必然有a1,此时如果锁定ai为最大值,那么所有满足(a1最小,ai最大)的子序列数量必然ai*ai*a1*pow(2,i-2)。

枚举下最大最小值分别为(i,j)的公式

最大值j\最小值ia1       a2a3......总和
a2a1*a2*a2

(a1)*a2*a2

a32a1*a3*a3a2*a3*a3

(2a1+a2)*a3*a3

a44a1*a4*a42a2*a4*a4(4a1+2a2+a3)*a4*a4
a58a1*a5*a54a2*a5*a52a3*a5*a5......(8a1+4a2+2a3+a4)*a5*a5
a616a1*a6*a68a2*a6*a64a3*a6*a6......

可以发现规律为当ai为最大值时,其组成所有子序列的力量和为Y[i]*a[i]*a[i],而这个Y[i]可以由Y[i-1]*2+a[i-1]求得。

class Solution {
public:int sumOfPower(vector<int>& nums) {int i,j,r=nums.size()-1,mod=1e9+7;;sort(nums.begin(),nums.end());/**< 排序 */long long ans=0,sum=nums[0];for(i=0;i<=r;i++)/**< 就一个元素序列单独处理 */ans=(ans+1LL*nums[i]*nums[i]%mod*nums[i])%mod;for(i=1;i<=r;i++)/**< 最大值为i的力量和 */{long long temp=1LL*nums[i]*nums[i]%mod;ans=(ans+temp*sum%mod)%mod;sum=(sum*2+nums[i])%mod;/**< i+1的系数 */}return (int)ans;}
};

两个循环综合在一起的写法。

class Solution {
public:int sumOfPower(vector<int>& nums) {int i,j,r=nums.size()-1,mod=1e9+7;;sort(nums.begin(),nums.end());/**< 排序 */long long ans=0,sum=0;for(i=0;i<=r;i++)/**< 最大值为i的力量和 */{long long temp=1LL*nums[i]*nums[i]%mod;ans=(ans+temp*(sum+nums[i])%mod)%mod;sum=(sum*2+nums[i])%mod;/**< i+1的系数 */}return (int)ans;}
};

http://www.lryc.cn/news/69450.html

相关文章:

  • 在linux上创建crypto_LUKS格式的块设备
  • 76.建立一个主体样式第二部分
  • SQL删除重复的记录(只保留一条)-窗口函数row_number()
  • CF1660D Maximum Product Strikes Back 题解
  • 基于CSSOM的暗链检测技术实现方案
  • MySQL db、tables_priv、columns_priv和procs_priv权限表
  • JavaWeb-JSP的学习
  • 力扣sql中等篇练习(二十三)
  • C语言算法之查找
  • 肝一肝设计模式【九】-- 享元模式
  • 自动化测试的十大雷区【刚入门必看】
  • 【Android源码篇】用grep搜索源码内容关键词
  • 腾讯云轻量应用服务器卡死怎么连接?
  • Charles安装及抓取APP接口
  • Linux开发工具:yum和vim的使用
  • Java基础重温巩固
  • Text2SQL 语义解析数据集、解决方案和学术论文资源整合
  • redis集群+哨兵配置实操宝典
  • nginx的语法
  • 华为OD机试之英文输入法(Java源码)
  • 一个团队管理者应该干什么?
  • 服务器数据库文件加载到 MySQL
  • 6-《网络面试》
  • [高光谱]高光谱数据的获取与展示
  • veth网卡的多队列及RPS
  • 国内的程序员数量是否已经饱和或者过剩?
  • flutter不能抓包
  • 从桌面端到移动端,.NET MAUI为什么对WPF开发人员更简单?
  • [Python]... 和pass
  • 【信息安全案例】——软件解密技术(以OllyDbg为例)