【力扣每日一题】2023.8.1 英雄的力量

news2024/11/25 20:33:04

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们一个数组,让我们找出数组的每个非空子数组(不用连续),然后按照公式算出子数组的值,然后返回所有子数组的值的总和。

公式是子数组里最小的数乘上子数组里最大的数的平方。

我们可以从公式中得知,数组的值之和最小值和最大值有关,所以只要我取的子数组的数组范围在两个数之间,那么数组里的其他元素怎么选,最终的值都不会 改变。

那么这类和数值大小有关,又和数组顺序没什么关系的题目,我们都可以把数组给先排序一边。

排序完我们可以发现,可以利用双指针来做,双指针来指向数组的两个元素,表示我以这两个元素为开头和结尾的子数组,从下图(已经以英雄的力量值排完序了)可以看出,以两个元素为开头和结尾的子数组一共是有2*(j-i)个的,而他们的值都等于nums[i]*nums[j]*nums[j],所以我们不需要得出所有的子数组,因为只要首尾元素相同,那么子数组的数值就是一样的,我们只需要遍历所有子数组可能的首尾,再把对应的数组乘上对应的子数组数量就可以。

还是以下图为例 ,我取1和4为首尾元素 ,那么以1和4位首尾元素的子数组的值为1*4*4=16,然后以1和4位首尾元素的子数组一共有(2^(j-i-1))个,所以我们只需要两层for循环把所有可能的首尾元素遍历一边,再根据左右指针拿到最小值和最大值算出结果,再乘上对应子数组的数量,再加回答案中。

但是这样会有两个问题,第一个是数值溢出,第二个是超时。

所以我们需要想个别的办法。

我们先把每个元素的以此元素为结尾的子数组的总和求出来,参考下图:

 看起来有些乱,我们化简一下,提出公因子:

 看起来有些规律了,不过数值的2和代表2个子数组数量的2有些让人分不清,所以我接下来把数值改为字母,因为整个数组是排序后的,因此字母越大就代表数值越大:

 我们可以发现,每次得出的结果都是当前数的平方乘上当前数再加上上一个数然后在加上一堆看起来有些规律的东西,我们接着分析,看看能不能找出具体的规律。

在第一个数(A)的 前面我们再加一个数(其实数组里没有,只是为了推导出规律才添加上去的),注意标红的表达式,它们是有种继承的关系存在的。

 例如从A开始,标红的是0,因为A前面没有东西了。

B标红的是A。

C标红的是B+2*A。

D标红的是C+2*B+4*A。

发现了吗,除了当前字母的前一个字母,其他都是上一个字母标红的部分乘2。

至此我们已经找出了规律,为了便于归纳,参考下图:

 那么根据上面的两个式子,我们想要解出本题,只需要遍历整个数组一次,时间复杂度比之前的第一种要小了不少。

我们定义一个临时变量来存放标红的部分,每次循环先将当前遍历到的数的平方乘上当前数加上这个临时变量,然后在更新临时变量,也就是临时变量乘2再加上当前遍历到的数。

 遍历完毕,我们也就可以得出题目的答案了。

代码:

class Solution {
public:
    int sumOfPower(vector<int>& nums) {
        sort(nums.begin(),nums.end());    //排序
        unsigned long mod=1000000007;    //记录取模的值
        unsigned long res=0;     //答案
        unsigned long temp=0;    //临时变量
        for(long long num:nums){    
            res+=num*num%mod*(num+temp);    //因为中间可能会数值溢出,因此要取个模
            res%=mod;
            temp=(temp*2+num)%mod;    //更新临时变量
        }
        return res;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/819229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CNN、数据预处理、模型保存

目录 CNN代码读取数据搭建CNN训练网络模型 数据增强迁移学习图像识别策略数据读取定义数据预处理操作冻结resnet18的函数把模型输出层改成自己的设置哪些层需要训练设置优化器和损失函数训练开始训练再训练所有层关机了&#xff0c;再开机&#xff0c;加载训练好的模型 CNN 代码…

计算机网络(2) --- 网络套接字UDP

计算机网络&#xff08;1&#xff09; --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm1001.2014.3001.5501 目录 1.端口号 2.TCP与UDP协议 1.TCP协议介绍 1.TCP协议 2.UDP协议 3.理解 2.网络字节序 发送逻辑…

Node.js之express框架学习心得

Node.js:颠覆传统的服务器端开发 Node.js是基于Chrome V8引擎构建的JavaScript运行时,它采用了完全不同的开发模型。Node.js使用事件驱动和非阻塞I/O的方式处理请求,通过单线程和异步机制,实现高效的并发处理。这意味着在Node.js中,一个线程可以处理数千个并发连接,大大提…

Debian 12.1 “书虫 “发布,包含 89 个错误修复和 26 个安全更新

导读Debian 项目今天宣布&#xff0c;作为最新 Debian GNU/Linux 12 “书虫 “操作系统系列的首个 ISO 更新&#xff0c;Debian 12.1 正式发布并全面上市。 Debian 12.1 是在 Debian GNU/Linux 12 “书虫 “发布六周后推出的&#xff0c;目的是为那些希望在新硬件上部署操作系统…

从内核源码看 slab 内存池的创建初始化流程

slab cache 机制确实比较复杂&#xff0c;涉及到的场景又很多&#xff0c;大家读到这里&#xff0c;我想肯定会好奇或者怀疑笔者在上篇文章中所论述的那些原理的正确性&#xff0c;毕竟 talk is cheap &#xff0c;所以为了让大家看着安心&#xff0c;理解起来放心&#xff0c;…

让SpringBoot不需要Controller、Service、DAO、Mapper,卧槽!这款工具绝了!

Dataway介绍 Dataway 是基于 DataQL 服务聚合能力&#xff0c;为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应…

在windows下安装ruby使用gem

在windows下安装ruby使用gem 1.下载安装ruby环境2.使用gem3.gem换源 1.下载安装ruby环境 ruby下载地址 选择合适的版本进行下载和安装&#xff1a; 在安装的时候&#xff0c;请勾选Add Ruby executables to your PATH这个选项&#xff0c;添加环境变量&#xff1a; 安装Ruby成…

vue-print-nb使用(实现分页打印)

参考链接&#xff1a;vue-print-nb - npm (npmjs.com)https://www.npmjs.com/package/vue-print-nb 一、安装 1、Vue2安装 npm install vue-print-nb --save <!-- 全局配置&#xff1a;main.js --> import Print from vue-print-nb // Global instruction Vue.use(P…

解码“平台工程”,VMware 有备而来

随着全球数字化进程加快&#xff0c;企业使用前沿技术加快商业创新&#xff0c;以提高竞争力。其中如何加快开发效率&#xff0c;为客户创造更多价值成为新的关注焦点。 继DevOps后&#xff0c;“平台工程”&#xff08;Platform Engineering&#xff09; 一词引发热议。平台工…

Redis的安装部署以及基本的使用

目录 一、Linux下直接安装Redis &#xff08;1&#xff09;下载Redis安装包 &#xff08;2&#xff09;安装GCC编译环境 &#xff08;3&#xff09;安装Redis &#xff08;4&#xff09;服务启动 &#xff08;5&#xff09;后台启动 二、使用Docker安装部署Redis &…

火车头采集器免费版【php源码】

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python turtle circle 画半圆圆心在哪&#xff0c;python中用turtle画一个圆形&#xff0c;现在让我们一起来看看吧&#xff01; 1、t.circle(100,180)的意思&#xff1f; t.circle(100, 180)是Python中turtle库中的一…

18- C++ 强制类型转换-6 (C++)

第八章 强制类型转换 c提供了 隐式类型转换&#xff0c;所谓隐式类型转换&#xff0c;是指不需要用户干预&#xff0c;编译器默认进行的类型转换行为&#xff08;很多时候用户可能都不知道到底进行了哪些转换&#xff09;。例如&#xff1a; int nValue 8; double dValue 10…

评估修改后的YOLOv8模型的参数量和速度

YOLOv8公布了自己每个模型的速度和参数量 那么如果我们自己对YOLOv8做了一些修改&#xff0c;又怎么样自己写代码统计一下修改后的模型的参数量和速度呢&#xff1f; 其实评估这些东西&#xff0c;大多数情况下不需要我们从头自己写一个函数来评估 一般来说&#xff0c;只要…

【云存储】使用OSS快速搭建个人网盘教程(阿里云)

使用OSS快速搭建个人网盘 一、基础概要1. 主要的存储类型1.1 块存储1.2 文件存储1.3 对象存储 2. 对象存储OSS2.1 存储空间2.2 地域2.3 对象2.4 读写权限2.5 访问域名&#xff08;Endpoint&#xff09;2.6 访问密钥2.7 常用功能&#xff08;1&#xff09;创建存储空间&#xff…

HCIP-datacom-831题库

考取HCIP数通证书可以胜任中到大型企业网络工程师岗位&#xff0c;需要掌握中到大型网络的特点和通用技术&#xff0c;具备使用华为数通设备进行中到大型企业网络的规划设计、部署运维、故障定位的能力&#xff0c;并能针对网络应用设计出较高安全性、可用性和可靠性的解决方案…

RedisJava的Java客户端

目录 1.Jedis的使用 前置工作-ssh进行端口转发 JedisAPI的使用 Jedis连接池 2.SpringDataRedis的使用 1.创建项目 2.配置文件 3.注入RedisTemplate对象 4.编写代码 3.SpringRedisTemplate 哈希结构用法 ​总结 1.Jedis的使用 Jedis&#xff1a;以Redis命令作为方法…

途乐证券:沪指强势拉升涨0.63%,券商等板块走强,传媒板块活跃

31日早盘&#xff0c;两市股指全线走高&#xff0c;沪指一度涨超1%收复3300点&#xff0c;上证50指数盘中涨逾2%&#xff1b;随后涨幅有所收窄&#xff1b;两市成交额显着放大&#xff0c;北向资金净买入超90亿元。 到午间收盘&#xff0c;沪指涨0.63%报3296.58点&#xff0c;深…

Python多线程与GIL锁

Python多线程与GIL锁 python多线程 Python的多线程编程可以在单个进程内创建多个线程来同时执行多个任务&#xff0c;从而提高程序的效率和性能。Python的多线程实现依赖于操作系统的线程调度器&#xff0c;并且受到全局解释器锁&#xff08;GIL&#xff09;的限制&#xff0c…

如何在 Ubuntu 22.04 下编译 StoneDB for MySQL 8.0 | StoneDB 使用教程 #1

作者&#xff1a;双飞&#xff08;花名&#xff1a;小鱼&#xff09; 杭州电子科技大学在读硕士 StoneDB 内核研发实习生 ❝ 大家好&#xff0c;我是 StoneDB 的实习生小鱼&#xff0c;目前正在做 StoneDB 8.0 内核升级相关的一些事情。刚开始接触数据库开发没多久&#xff0c…