环形数组中的最大贡献值

题干如下:

小S拿到了一个长度为 $n$ 的环形数组,并定义了两个下标 $i$ 和 $j$ 的贡献值公式为: f(i,j)=(a_i + a_jx dist(i,i)其中 dist(i,j)是下标$i$ 和 $i$ 在数组中的最短距离。小S希望找到一对下标,使得它们的贡献值尽可能大。环形数组的特点是最左和最右的元素也是相邻的。你需要帮助她找到最大贡献值。 例如,给定数组[1,2,31,由于是环形数组,任意两个下标的距离都是1,因此  f(2,3)=(2+3)x1=5。

解题思路:

  1. 初始化最大贡献值变量

    • let maxContribution = -Infinity; 这行代码定义了一个变量 maxContribution,并将其初始化为负无穷大。这么做的原因是,在开始遍历计算所有下标对的贡献值之前,我们不知道最大贡献值是多少,将其初始化为一个极小的值(在 JavaScript 中用 -Infinity 表示负无穷大),可以确保后续计算出的任何贡献值都能与其比较并在必要时更新它,使得 maxContribution 始终记录当前找到的最大贡献值。
  2. 双层 for 循环遍历下标对

    • 外层 for 循环 for (let i = 0; i < n; i++) 用于控制第一个下标 i 的取值,它从 0 开始,每次递增 1,直到 i 的值达到数组长度 n - 1。这个循环会遍历环形数组中所有可能作为第一个下标的位置。
    • 内层 for 循环 for (let j = 0; j < n; j++) 用于控制第二个下标 j 的取值,同样从 0 开始,每次递增 1,直到 j 的值达到数组长度 n - 1。对于外层循环每确定的一个 i 值,内层循环都会完整地遍历一遍所有可能的 j 值,这样就实现了对环形数组中所有下标对 (i, j) 的遍历。
  3. 计算下标对的最短距离 dist

    • let dist = Math.min(Math.abs(i - j), n - Math.abs(i - j)); 这行代码用于计算下标 i 和 j 在环形数组中的最短距离。
    • Math.abs(i - j) 计算的是按照正常顺序(非环形考虑)下标 i 和 j 的距离的绝对值,比如 i = 1j = 3,那么 Math.abs(1 - 3) = 2
    • 然而,在环形数组中,还存在另一种情况,就是从数组末尾绕到开头的距离更短。例如,对于长度为 5 的环形数组,当 i = 0j = 3 时,正常顺序距离是 3,但从环形角度考虑,跨越数组边界的距离是 5 - 3 = 2,这种情况下 n - Math.abs(i - j) 就表示跨越边界的距离(n 是数组长度)。通过 Math.min 函数取这两种距离(正常顺序距离和跨越边界距离)中的较小值,就能得到环形数组中两个下标之间的最短距离 dist
  4. 计算当前下标对的贡献值 contribution

    • let contribution = (a[i] + a[j]) * dist; 这行代码根据给定的贡献值计算公式 f(i, j) = (a[i] + a[j]) * dist(i, j) 来计算当前下标对 (i, j) 的贡献值。其中 a[i] 和 a[j] 分别是环形数组中对应下标位置的元素值,通过索引数组 a 来获取,然后将这两个元素值相加后再乘以前面计算得到的最短距离 dist,就得到了当前下标对的贡献值 contribution
  5. 更新最大贡献值 maxContribution

    • maxContribution = Math.max(maxContribution, contribution); 这行代码将当前计算得到的贡献值 contribution 和已经记录的最大贡献值 maxContribution 进行比较。Math.max 函数会返回两个值中的较大值,所以如果 contribution 比 maxContribution 更大,就会将 maxContribution 更新为 contribution 的值,从而保证 maxContribution 始终记录着到目前为止遍历过程中找到的最大贡献值。
  6. 返回最大贡献值

    • 在双层 for 循环结束后,maxContribution 变量中存储的就是整个环形数组所有下标对中最大的贡献值了,最后通过 return maxContribution; 将这个最大贡献值返回。

 

function solution(n, a) {let maxContribution = -Infinity;for (let i = 0; i < n; i++) {for (let j = 0; j < n; j++) {let dist = Math.min(Math.abs(i - j), n - Math.abs(i - j));let contribution = (a[i] + a[j]) * dist;maxContribution = Math.max(maxContribution, contribution);}}return maxContribution;
}function main() {console.log(solution(3, [1, 2, 3]) === 5);console.log(solution(4, [4, 1, 2, 3]) === 12);console.log(solution(5, [1, 5, 3, 7, 2]) === 24);
}main();

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

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

相关文章

【windows 下使用 tree】

windows git bash 下使用 tree 下载tree二进制文件 https://gnuwin32.sourceforge.net/packages/tree.htm 解压缩找到 tree.exe 扔进git bash的命令目录 C:\Program Files\Git\usr\bin 打开测试

GxtWaitCursor:Qt下基于RAII的鼠标等待光标类

有时我们需要以阻塞的方式执行一点耗时的操作&#xff0c;这时需要主窗口光标呈现忙状态&#xff0c;GxtWaitCursor正是为此设计&#xff1b;重载的构造函数&#xff0c;可以让光标呈现忙状态一定时间后自动恢复。 GxtWaitCursor.h #pragma once#include <QObject>// // …

通过Python,Tkinter,文本文件,Openpyxl。实现【图书馆管理系统实现技术】

图书馆管理系统 目录 项目概述类定义 -Book类 -Library类书籍管理功能 -添加书籍 -查找书籍 -借阅书籍 -归还书籍 -列出所有书籍数据持久化 -保存书籍 -加载书籍操作日志记录图形用户界面(GUI) -界面设计 -功能实现代码原理总结实现界面 ![](https://i-blog.csdnimg.cn/dire…

飞牛私有云访问外网

飞牛私有云 fnOS NAS 是一款有着卓越的性能以及强大的兼容性和智能化的管理界面&#xff0c;它之所以能在 NAS 市场中脱颖而出&#xff0c;是因为 fnOS 基于最新的 Linux 内核&#xff08;Debian发行版&#xff09;深度开发&#xff0c;不仅兼容主流 x86 硬件&#xff0c;还支持…

HTML之表单学习记录

如果一个页面仅仅供用户浏览&#xff0c;那就是静态页面。如果这个页面还能实现与服务器进行数据交互&#xff08;像注册登录、话费充值、评论交流&#xff09;​&#xff0c;那就是动态页面。表单是我们接触动态页面的第一步。其中表单最重要的作用就是&#xff1a;在浏览器端…

redis 原理篇 30 redis内存回收 过期key处理

三十分&#xff0c;又是一个长视频&#xff0c;挺好&#xff0c;但是从标题来看&#xff0c;内容应该很简单&#xff0c;或者说&#xff0c;是他能讲简单的类型&#xff0c;本来还想再搞一篇&#xff0c;但是三十分钟的话&#xff0c;五点五十了&#xff0c;算了&#xff0c;下…

【STM32F1】——无线收发模块RF200与串口通信

【STM32F1】——无线收发模块RF200与串口通信 一、简介 本篇主要对调试无线收发模块RF200的过程进行总结,实现了以下功能。 串口普通收发:使用STM32F103C8T6的USART2串口接收中断,实现两个无线收发模块RF200间的通信。二、RF200介绍 电压:3.4-5.5V工作频率:418~455MHz发…

【MySQL从入门到放弃】InnoDB磁盘结构(二)

前言 前面我们解析了InnoDB磁盘结构中的表空间、数据字典、双写缓冲区。 本文我们继续探究磁盘结构中剩余的几个核心组件:重做日志(redo log)、撤销日志(undo log)、二进制日志(binlog) 一、重做日志 ( redo log ) WAL(Write-Ahead Logging)机制 WAL 的全称是…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转这些功能

&#xff08;一&#xff09;安装插件SystemVerilog - Language Support 安装一个vscode插件即可&#xff0c;插件叫SystemVerilog - Language Support。虽然说另一个插件“Verilog-HDL/SystemVerilog/Bluespec SystemVerilog”也有信号提示及定义跳转功能&#xff0c;但它只能提…

LLM RAG系列:一文详解RAG,看完这篇你必会(文末福利)

RAG系列 本文介绍了RAG以及RAG pipeline的整个流程&#xff0c;包括请求转换、路由和请求构造、索引和检索、生成和评估等&#xff0c;其中引用了大量有价值的论文。 参考Advanced RAG Series: Generation and Evaluation中的5篇文章&#xff0c;并丰富了相关内容。 请求转换…

服务器硬件介绍

计算机介绍 现在的人们几乎无时无刻都在使用电脑&#xff01;而且已经离不开电脑了。像桌上的台式电脑(桌机)、笔记本电脑(笔电)、平板电脑、智能手机等等&#xff0c;这些东西都算是电脑。 台式机电脑介绍 计算机又被称为电脑。台式机电脑主要分为主机和显示器两个部分&…

docker启动mysql数据库镜像,开启大小写不敏感,开启不区分大小写,挂载数据库日志文件,挂载数据库文件

docker启动mysql数据库镜像,开启大小写不敏感,开启不区分大小写,挂载数据库日志文件,挂载数据库文件 查询数据库是否区分大小写 SHOW VARIABLES LIKE lower_case_table_names;查询数据库是否支持大小写lower_case_table_names 被设置为 1,即表名不区分大小写。如果值为 1…

SpringBoot 打造图片阅后即焚功能

阅后即焚”&#xff08;Snapchat-like feature&#xff09;是指一种社交媒体或信息传递功能&#xff0c;用户在阅读某条信息或查看某张图片后&#xff0c;该信息或图片会自动销毁&#xff0c;无法再次查看。这种功能的主要目的是保护用户的隐私和信息安全&#xff0c;防止敏感信…

年轻人应该读毛选(一到五卷)!!!

在线网址&#xff1a;中文马克思主义文库毛泽东 (marxists.org) 书籍的现实意义&#xff0c;往往是在读后很久才能有所体会的。 推荐《毛泽东选集》——智慧与实践的经典之作 今天想给大家推荐一本充满智慧和深刻洞见的书——《毛泽东选集》。这不仅是一本书&#xff0c;更是…

Java期末复习暨学校第六次上机课作业

Java期末复习暨学校第六次上机课作业&#xff1a; 第一题&#xff1a; 通过new关键字实例化了一个Students类对象s&#xff0c;并调用set方法分别赋值&#xff0c;最后调用study和introduce方法。 输出结果&#xff1a; 第二题&#xff1a; 给出了一个无参构造方法和有参构造…

【操作系统】守护进程

一、守护进程的概念 守护进程是一个在后台运行并且不受任何终端控制的进程 二、自己实现守护进程 1.预备知识 &#xff08;1&#xff09;/dev/null /dev/null是一个特殊的设备文件&#xff0c;往这个文件里写不进去任何数据&#xff0c;也读不出来任何数据 因此&#xff0…

MySQL数据库常用命令大全(完整版——表格形式)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…

TCP滑动窗口

TCP滑动窗口&#xff08;Sliding Window&#xff09; 什么是滑动窗口&#xff1f; TCP滑动窗口是TCP协议中的一种流量控制机制&#xff0c;用于调节发送方和接收方之间的数据传输速率&#xff0c;以避免网络拥塞和提高传输效率。 滑动窗口机制允许发送方在不等待确认应答的情…

main中的int argc, char* argv[],命令行调用函数时输入参数用的

int argc&#xff1a;表示命令行参数的数量。argc 至少为1&#xff0c;因为第一个参数总是程序的名称。char* argv[]&#xff1a;是一个字符指针数组&#xff0c;用于存储每个命令行参数的字符串。argv[0] 是程序的名称&#xff0c;argv[1] 是第一个参数&#xff0c;依此类推。…