返回介绍

solution / 2700-2799 / 2786.Visit Array Positions to Maximize Score / README

发布于 2024-06-17 01:03:00 字数 3621 浏览 0 评论 0 收藏 0

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

English Version

题目描述

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

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

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

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

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

 

示例 1:

输入:nums = [2,3,6,1,9,2], x = 5
输出:13
解释:我们可以按顺序访问数组中的位置:0 -> 2 -> 3 -> 4 。
对应位置的值为 2 ,6 ,1 和 9 。因为 6 和 1 的奇偶性不同,所以下标从 2 -> 3 让你失去 x = 5 分。
总得分为:2 + 6 + 1 + 9 - 5 = 13 。

示例 2:

输入:nums = [2,4,6,8], x = 3
输出:20
解释:数组中的所有元素奇偶性都一样,所以我们可以将每个元素都访问一次,而且不会失去任何分数。
总得分为:2 + 4 + 6 + 8 = 20 。

 

提示:

  • 2 <= nums.length <= 105
  • 1 <= nums[i], x <= 106

解法

方法一

class Solution:
  def maxScore(self, nums: List[int], x: int) -> int:
    f = [-inf] * 2
    f[nums[0] & 1] = nums[0]
    for v in nums[1:]:
      f[v & 1] = max(f[v & 1] + v, f[v & 1 ^ 1] + v - x)
    return max(f)
class Solution {
  public long maxScore(int[] nums, int x) {
    long[] f = new long[2];
    Arrays.fill(f, -(1L << 60));
    f[nums[0] & 1] = nums[0];
    for (int i = 1; i < nums.length; ++i) {
      f[nums[i] & 1] = Math.max(f[nums[i] & 1] + nums[i], f[nums[i] & 1 ^ 1] + nums[i] - x);
    }
    return Math.max(f[0], f[1]);
  }
}
class Solution {
public:
  long long maxScore(vector<int>& nums, int x) {
    const long long inf = 1LL << 60;
    vector<long long> f(2, -inf);
    f[nums[0] & 1] = nums[0];
    int n = nums.size();
    for (int i = 1; i < n; ++i) {
      f[nums[i] & 1] = max(f[nums[i] & 1] + nums[i], f[nums[i] & 1 ^ 1] + nums[i] - x);
    }
    return max(f[0], f[1]);
  }
};
func maxScore(nums []int, x int) int64 {
  const inf int = 1 << 40
  f := [2]int{-inf, -inf}
  f[nums[0]&1] = nums[0]
  for _, v := range nums[1:] {
    f[v&1] = max(f[v&1]+v, f[v&1^1]+v-x)
  }
  return int64(max(f[0], f[1]))
}
function maxScore(nums: number[], x: number): number {
  const inf = 1 << 30;
  const f: number[] = Array(2).fill(-inf);
  f[nums[0] & 1] = nums[0];
  for (let i = 1; i < nums.length; ++i) {
    f[nums[i] & 1] = Math.max(f[nums[i] & 1] + nums[i], f[(nums[i] & 1) ^ 1] + nums[i] - x);
  }
  return Math.max(f[0], f[1]);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文