LeetCode 2786. 访问数组中的位置使分数最大

2024-06-15 08:36

本文主要是介绍LeetCode 2786. 访问数组中的位置使分数最大,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目

1、题目描述

给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。

你 一开始 在数组的位置 0 处,你可以按照下述规则访问数组中的其他位置:

  • 如果你当前在位置 i ,那么你可以移动到满足 i < j 的 任意 位置 j 。
  • 对于你访问的位置 i ,你可以获得分数 nums[i] 。
  • 如果你从位置 i 移动到位置 j 且 nums[i] 和 nums[j] 的 奇偶性 不同,那么你将失去分数 x 。

请你返回你能得到的 最大 得分之和。

注意 ,你一开始的分数为 nums[0] 。

2、接口描述

python3
 ​
class Solution:def maxScore(self, nums: List[int], x: int) -> int:
cpp
 ​
class Solution {
public:long long maxScore(vector<int>& nums, int x) {}
};
js
 ​
/*** @param {number[]} nums* @param {number} x* @return {number}*/
var maxScore = function(nums, x) {};

3、原题链接

2786. 访问数组中的位置使分数最大


二、解题报告

1、思路分析

不难写出O(N^2)的朴素dp

f[i]为前i元素以i结尾的最大收益

但是我们发现我们状态转移和奇偶性有关

我们并不关注前面状态具体的值,我们只关注奇偶性

而我们每次无非就是从前面某个奇数结尾或者偶数结尾转移

那我们不妨只记录奇偶结尾的最大收益,然后进行转移即可

这样状态转移就变成了O(1)的

2、复杂度

时间复杂度: O(N)空间复杂度:O(1)

3、代码详解

python3
 ​
class Solution:def maxScore(self, nums: List[int], x: int) -> int:n = len(nums)f1 = nums[0] if nums[0] & 1 else -10**9f0 = nums[0] if f1 < 0 else -10**9for i in range(1, n):if nums[i] & 1:f1 = max(f1, f0 + nums[i] - x, f1 + nums[i])else:f0 = max(f0, f0 + nums[i], f1 + nums[i] - x)return max(f0, f1)
cpp
 ​
using i64 = long long;
const i64 inf = 1e9;
auto _ = []{std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);return 0;
};
class Solution {
public:long long maxScore(vector<int>& nums, int x) {i64 f[2] { -inf, -inf };int n = nums.size();f[nums[0] & 1] = nums[0];for (int i = 1; i < n; i ++) {int j = nums[i] & 1;f[j] = max(f[j ^ 1] + nums[i] - x, f[j] + nums[i]);}return std::max(f[0], f[1]);}
};
js
 ​
/*** @param {number[]} nums* @param {number} x* @return {number}*/
var maxScore = function(nums, x) {let f = [-Infinity, -Infinity];f[nums[0] & 1] = nums[0];for (let i = 1; i < nums.length; i ++ ) {let j = nums[i] & 1;f[j] = Math.max(f[j], f[j ^ 1] + nums[i] - x, f[j] + nums[i]);}return Math.max(f[0], f[1]);
};

这篇关于LeetCode 2786. 访问数组中的位置使分数最大的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062945

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方