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^51 <= 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)