leetcode 1770. Maximum Score from Performing Multiplication Operations(乘积的最大分数)

【LeetCode177】第N高的薪水(中等) 目录题目答案及分析方法一:单表查询方法二:子查询方法三:自连接方法四:笛卡尔积方法五:自定义变量方法六:窗口函数总结 题目 编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。 +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200 阅读详情

You are given two integer arrays nums and multipliers of size n and m respectively, where n >= m. The arrays are 1-indexed.

You begin with a score of 0. You want to perform exactly m operations. On the ith operation (1-indexed), you will:

Choose one integer x from either the start or the end of the array nums.
Add multipliers[i] * x to your score.
Remove x from the array nums.
Return the maximum score after performing m operations.

Example 1:

Input: nums = [1,2,3], multipliers = [3,2,1]
Output: 14
Explanation: An optimal solution is as follows:

  • Choose from the end, [1,2,3], adding 3 * 3 = 9 to the score.
  • Choose from the end, [1,2], adding 2 * 2 = 4 to the score.
  • Choose from the end, [1], adding 1 * 1 = 1 to the score.
    The total score is 9 + 4 + 1 = 14.
    Example 2:

Input: nums = [-5,-3,-3,-2,7,1], multipliers = [-10,-5,3,4,6]
Output: 102
Explanation: An optimal solution is as follows:

  • Choose from the start, [-5,-3,-3,-2,7,1], adding -5 * -10 = 50 to the score.
  • Choose from the start, [-3,-3,-2,7,1], adding -3 * -5 = 15 to the score.
  • Choose from the start, [-3,-2,7,1], adding -3 * 3 = -9 to the score.
  • Choose from the end, [-2,7,1], adding 1 * 4 = 4 to the score.
  • Choose from the end, [-2,7], adding 7 * 6 = 42 to the score.
    The total score is 50 + 15 - 9 + 4 + 42 = 102.

nums中每次要么从头,要么从尾取出一个数字,
multipliers中的数字是按从左到右的顺序取,
这俩取出来的数字相乘,加起来,最后能得到的最大分数是多少。

思路:

是不是曾几何时想到了greedy?
每次取能使score=nums[left or right] * multipliers[i] 较大的?
这对example1是行得通的,但是对example2就行不通了(自行验证)。

那就只有笨办法,所有可能的列举一遍,取最大的score。
但是这种笨办法肯定会TLE的,因为有很多重复的计算,如下图的v(e)和v(a)。
在这里插入图片描述
这不难让人想到把重复计算的部分保存起来,直接取结果,
就是DP.

但是DP的状态怎么定义呢。
看score的计算:score=nums[left or right] * multipliers[i]
这里面需要知道left, right指针指向哪个数字,还要知道i, 也就是到目前为止操作了几次。
后面把这个i 称为 op (操作次数)

那岂不是要三维DP?
有没有注意到left + right = op的,操作次数就那么多,不是left 就是 right.
注意,这里的right是指在右边取了多少个数字,并不是指向nums的第几个元素,
但是现在想知道的right就是index, 这样才能通过nums[right]把数字取出来,
可通过op - left 知道右边已经取了几个数字,那下一个要取的右边数字的index就是 nums.length - 1 - (op - left)。
理解这点非常重要。

那么 dp[op][left] 定义为操作了op次,其中左边取了left个数字。

既然right可以通过left 和 op确定,那就只需要二维DP了。
如果取nums左边的数字,那么score1 = nums[left] * multipliers[op]
如果取nums右边的数字,那么score2 = nums[right] * multipliers[op]

但这只是当前这一步的score, 还要加上后续的计算,
经过这一步的计算,实际的操作数为op+1, 左边的数字个数为left+1
score1 = nums[left] * multipliers[op] + dp[op + 1][left + 1]
如果取右边的数字,那么left是不变的,op+1
score2 = nums[right] * multipliers[op] + dp[op+1][left]

还有一个问题,初始化。
你可能会想,op=0的dp为0,就是第一行为0.

但是看上面的图或state公式,可以看出,计算dp[op][left],
我们需要的是dp[op+1][left+1] 和 dp[op][left]
所以最终的初始化应该是dp[m]行=0,m=multipliers.length,

为什么呢?这样想,
在最开始的时候,score是不确定的,我不知道要选哪个数字,后面会选哪个数字,
只有在最后所有的数字选完以后,没有数字了,这时候的score肯定是0.
倒数第2步,在0的基础上加上剩下的最后一个数字,以此类推。
所以我们的计算是从最后往前计算的。

理解了这些以后,就好办了。

m为multipliers的长度,n为nums的长度。
所以声明DP数组,dp[m+1][n+1] ,
No,这样会MLE,内存超标。
这也是一个坑,
nums可以很长,但是很多数字用不到,因为要乘的数字在multipliers里,它就那么多,
left + right最多也不过m而已。所以要声明dp[m+1][m+1]

这个是按上面思路的做法,递归DP。

class Solution {
    Integer[][] dp;
    int n = 0;
    int m = 0;
    public int maximumScore(int[] nums, int[] multipliers) {
        n = nums.length;
        m = multipliers.length;
        
        dp = new Integer[m+1][m+1];
        
        return getScore(nums, multipliers, 0, 0);
    }
    
    int getScore(int[] nums, int[] multi, int op, int left) {
        if(op == m) return 0;
        if(dp[op][left] != null) return dp[op][left];
        
        int num1 = nums[left] * multi[op] + getScore(nums, multi, op+1, left+1);
        int num2 = nums[n-1-(op-left)] * multi[op] + 
            getScore(nums, multi, op+1, left);
        
        return dp[op][left] = Math.max(num1, num2);
    }
}

上面做法能通过,但比较慢,
改进一下,不要递归了。
left从右到左,从左到右都可以。

public int maximumScore(int[] nums, int[] multipliers) {
    int n = nums.length;
    int m = multipliers.length;
    
    int[][] dp = new int[m+1][m+1];
    
    for(int op = m-1; op >= 0; op--) {
        for(int left = op; left >= 0; left--) {
        //也可以是for(int left = 0; left <= op; left++) {
            int score1 = nums[left] * multipliers[op] + dp[op+1][left+1];
            int score2 = nums[n-1-(op-left)] * multipliers[op] +
                dp[op+1][left];
            dp[op][left] = Math.max(score1, score2);
        }
    }
    return dp[0][0];
}

上面是标准的二维DP,
有没有办法只用一维数组节省空间和时间呢?

注意到op只和上一个op相关,
left一定要从左到右覆盖上一层数据,因为用到了left+1

public int maximumScore(int[] nums, int[] multipliers) {
    int n = nums.length;
    int m = multipliers.length;
    
    int[][] dp = new int[m+1][m+1];
    
    for(int op = m-1; op >= 0; op--) {
        for(int left = 0; left <= op; left++) {
            int score1 = nums[left] * multipliers[op] + dp[op+1][left+1];
            int score2 = nums[n-1-(op-left)] * multipliers[op] +
                dp[op+1][left];
            dp[op][left] = Math.max(score1, score2);
        }
    }
    return dp[0][0];
}
荒岛逃生游戏 正负表示逃生方向(正表示向右逃生,负表示向左逃生),绝对值表示战斗力,越左边的数字表示里左边港口越近,逃生方向相同的人永远不会发生决斗。- 如果左逃生者的战斗力大于右逃生者,则左逃生者获胜,减少其战斗力,并将右逃生者出栈。- 处理完所有输入后,统计仍在右逃生者栈和左逃生者栈中的战斗力,即可得到成功逃生的人数。- 如果左逃生者的战斗力小于右逃生者,则右逃生者获胜,减少其战斗力,左逃生者出局。- 向左逃生:从右逃生者栈中取出元素,与当前逃生者进行决斗。- 继续进行决斗,直到没有右逃生者或左逃生者的战斗力用尽。 阅读详情

相关推荐

QGIS:安装Deepness插件+应用

简单的描述了deepness的安装应用历程,重点是记录博主本次遇到的坑

fengyi157的博客 2330

LeetCode每日一题(1770. Maximum Score from Performing Multiplication Operations)

【代码】LeetCode每日一题(1770. Maximum Score from Performing Multiplication Operations)

wangjun861205的博客 199

LIGGGHTS开源离散元仿真:从基础安装到高级应用实战

本文详细介绍了LIGGGHTS开源离散元仿真软件的基础安装、脚本编写及高级应用实战。从颗粒自由落体模拟到工业级复杂系统建模,涵盖CFD-DEM耦合、高性能计算优化等关键技术,帮助用户快速掌握这一强大的颗粒仿真工具。特别适合需要处理颗粒系统仿真的科研人员和工程师。

l1k9j8h7g6的博客 619

LeetCode 题解(177): Divide Two Integers

题目: Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 题解: 只能用移位运算,以2为基模拟除法。 边界情况: divisor == 0 ==> result = INT_MAX, dividend == IN

406

SpringCloud2025+SpringBoot3.5.0+gateway+webflux子服务路由报503

本来昨天就应该也记录下,免得忘记的,但是有点晚了,酒没写,真的是被坑惨了。当然这也是追求最新的代价,也是对新技术、老知识点的重温。依赖更粒度让架构的知识面更高,需要非常清楚另外说不定是有新的负载均衡要出现了,就想当初loadbalancer取代Ribbon一样好了,真是坑了半夜,昨晚都没有写,今天才复盘,希望能帮到大家,让更多在坑里的技术人爬出来。

zwrlj527的专栏 1996

第一章 初识SpringBoot

提供大量的自动配置Spring和第三方库,开发者可以根据项目需求选择相关的starters依赖,而无需手动配置大量的Spring配置文件,开箱即用,无需配置XML,无代码生成。Spring Boot与Spring Cloud等框架集成,为构建微服务提供了强大的支持,并通过Spring Cloud实现服务注册、负载均衡、熔断等功能。本质上讲,Spring Boot就是Spring,它做了那些本应我们去做的Spring Bean配置等工作。以上就是一个简单的Spring Boot应用的创建和运行过程。

Calvin的博客 1580

leetCode177|第三大的数

一,第三大的数1,问题简述给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。2,示例描述示例 1: 输入: [3, 2, 1...

qq_35006660的博客 234

面向非平行语料的语音转换技术综述

摘要语音转换是语音及人工智能领域的一项研究课题,其目标是在保持源语音内容不变的情况下改变语音的音色,使其听上去像是由另一个目标说话人说出的,同时还需保证语音的质量和自然度。面向非平行语料的语音转换技术是当下的热门研究内容,其使用非平行的多说话人语音数据集进行模型训练,能完成多对多以及任意对任意的语音转换。对近年来面向非平行语料的语音转换进行了全面的总结和分析。首先概述了早期面向平行语料的语音转换及其缺陷,然后对当下面向非平行语料的语音转换的各类实现方法进行介绍和对比分析,最后对语音转换技术进行了总结和展望。

qq_61890005的博客 829

LeetCode题练习与总结:第N高的薪水--177

本文详细介绍了如何编写一个 SQL 函数来查询 Employee 表中第 N 高的工资,涵盖了函数定义、变量声明、子查询、别名使用、NULL 处理等多个知识点,并分析了时间复杂度和空间复杂度,为解决此类问题提供了全面指导。

一直学习永不止步 1011

【WorkBuddy从入门到精通实战教程】实战案例 第 18 章 把投资分析(炒股)变成你的日常

投资本身就是一件高度信息密集、强结构化、又极度依赖判断的事:读不完的财报、理不清的行业、吵不停的多空。而整理碎片信息、拆解复杂材料、把思考过程摆到台面上,恰好是 AI 擅长的。 在一次完整的股票研究里,AI 到底能替你做掉哪些低质量的重复劳动,把精力还给判断本身。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 458

计算机组成原理(第三版)唐朔飞-第一章第二章-课后习题

计算机组成原理

weixin_45735391的博客 7万+

LeetCode 177.第N高薪水(解题思路)

LeetCode 177.第N高薪水解题思路问题:代码:思路: 问题: 177. 第N高的薪水 编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。 +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水

Devout-mzc 447

Qt | 开发过程中总结的经验

关于如何判断自己的Qt库是多少位,有个误区就是很多人要么看成了QtCreator的关于信息中列出的位数,要么以为自己是64位的系统就认为是64位的Qt,最终要在Qt构建套件中查看具体位数,大概从Qt5.14开始基本上很少提供32位的库,尤其是Qt6.0以后基本上默认就是只有64位的库了,这也是顺应时代潮流,毕竟不久的将来(个人预计2030年以前)基本上32位的系统占比不超过1%,放心大胆的用64位的库吧,抛弃烦人的32位以及XP系统。Qt常用类的头文件的函数看完学完使用一遍并加以融会贯通,月薪30K起步。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 488

LeetCode177——第N高的薪水

我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/nth-highest-salary/description/ 题目描述: 知识点:LIMIT语句、SQL函数变量的定义和使用 思路:和LeetCode176——第二高的薪水相同的解法 由于要查的是第N高的...

清风阁 630

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

177. 第N高的薪水

表:Employee +-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | salary | int | +-------------+------+ Id是该表的主键列。 该表的每一行都包含有关员工工资的信息。 编写一个SQL查询来报告 Employee 表中第 n 高的工资。如果没有第 n 个最高工资,查询应该报告为null 。 查询结果格式如下...

我真的睡不够 660

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LeetCode177--不用加减乘除做加法(O65)、队列的最大值(O59)、n个骰子的点数(O60)、把字符串转换成整数(O67)

1、不用加减乘除做加法 //写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。 // // // // 示例: // // 输入: a = 1, b = 1 //输出: 2 // // // // 提示: // // // a, b 均可能是负数或 0 // 结果不会溢出 32 位整数 // // Related Topics 位运算 数学 不用加减乘除做加法,直接采用本位加进位的方式进行,按位进行异再左移一位就能得到进位,按位相与就能得到本位,然后相加,

qq_40971025的博客 279

Leetcode-题解记录-1793-好子数组的最大分数-maximumScore

题目要求: 给你一个整数数组 nums (下标从 0 开始)和一个整数 k 。 一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 。一个 好 子数组的两个端点下标需要满足 i <= k <= j 。 请你返回 好 子数组的最大可能 分数 。 示例 1: 输入:nums = [1,4,3,7,4,5], k = 3 输出:15 解释:最优子数组的左右端点下标是 (1, 5) ,分数为 .

ptlovepr的博客 871

Leetcode 1770:执行乘法运算的最大分数

题目描述 给你两个长度分别 n 和 m 的整数数组 nums 和 multipliers ,其中 n >= m ,数组下标 从 1 开始 计数。 初始时,你的分数为 0 。你需要执行恰好 m 步操作。在第 i 步操作(从 1 开始 计数)中,需要: 选择数组 nums 开头处或者末尾处 的整数 x 。 你获得 multipliers[i] * x 分,并累加到你的分数中。 将 x 从数组 nums 中移除。 在执行 m 步操作后,返回 最大 分数。 示例 1: 输入:nums = [1.

weixin_35338624的博客 263

Get the Maximum Score

You are given twosortedarrays of distinct integersnums1andnums2. Avalidpathis defined as follows: Choosearray nums1 or nums2 to traverse (from index-0). Traverse the current array from left to right. If you are reading any value that is presen...

leetcode 解题思路 348

LeetCode 1537. 最大得分(切片取出局部最大值)

文章目录1. 题目2. 解题 1. 题目 你有两个 有序 且数组内元素互不相同的数组 nums1 和 nums2 。 一条 合法路径 定义如下: 选择数组 nums1 或者 nums2 开始遍历(从下标 0 处开始)。 从左到右遍历当前数组。 如果你遇到了 nums1 和 nums2 中都存在的值,那么你可以切换路径到另一个数组对应数字处继续遍历(但在合法路径中重复数字只会被统计一次)。 得分定义为合法路径中不同数字的和。 请你返回所有可能合法路径中的最大得分。 由于答案可能很大,请你将它对 10^9

Michael是个半路程序员 1386

leetcode 1753. Maximum Score From Removing Stones(python)

描述 You are playing a solitaire game with three piles of stones of sizes a​​​​​​, b,​​​​​​ and c​​​​​​ respectively. Each turn you choose two different non-empty piles, take one stone from each, and add 1 point to your score. The game stops when there are f

王大呀呀的博客 478

LeetCode_OJ【177】Nth Highest Salary

Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ For exampl

hb_peng的专栏 815

leetcode-database-177. Nth Highest Salary

Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+

woshiluahuo的博客 526

leetcode MYSQL数据库题目177

177. Nth Highest Salary 1、题目与答案 Table:Employee +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ Write a SQL query to get the n...

pg的博客 601

【LeetCode】177.第N高的薪水

编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。 ±—±-------+ | Id | Salary | ±—±-------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | ±—±-------+ 例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查询...

wangyucui123的博客 417

LeetCode177-MySQL-第N高的薪水

编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 ...

希尔芬酱的博客 1247

leetcode试题 177. 第N高的薪水

leetcode试题 177. 第N高的薪水 SQL架构 表: Employee ±------------±-----+ | Column Name | Type | ±------------±-----+ | id | int | | salary | int | ±------------±-----+ Id是该表的主键列。 该表的每一行都包含有关员工工资的信息。 编写一个SQL查询来报告 Employee 表中第 n 高的工资。如果没有第 n 个最高工资,查询

Jeremy__Liu的博客 1131
上一篇: no cuda runtime is found解决
下一篇: leetcode 609. Find Duplicate File in System(找到相同的文件)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值