LC每日一题|20240614 - 2786. 访问数组中的位置使分数最大

77 阅读1分钟

LC每日一题|20240614 - 2786. 访问数组中的位置使分数最大

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

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

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

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

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

提示:

  • 2 <= nums.length <= 10^5
  • 1 <= nums[i], x <= 10^6

题目等级:Medium

解题思路

非常简单的一道dp题~

遍历一次,全程需要维护两个值:前一个访问的数字为偶数时获得的最大分数 和 前一个访问的数字为奇数时获得的最大分数。

需要注意对初始值的处理。

AC代码

class Solution {
    fun maxScore(nums: IntArray, x: Int): Long {
        var o = nums[0].toLong() - if (nums[0] % 2 == 1) x else 0
        var j = nums[0].toLong() - if (nums[0] % 2 == 0) x else 0
        for (i in 1 until nums.size) {
            if (nums[i] % 2 == 0) {
                o = Math.max(o, j - x) + nums[i]
            } else {
                j = Math.max(j, o - x) + nums[i]
            }
        }
        return Math.max(o, j)
    }
}

时间复杂度: O(N)

空间复杂度: O(1)