题解 | #牛群的最大能量环# java
牛群的最大能量环
https://www.nowcoder.com/practice/653d5a6041a04b8cb9b082eeb1429d1c
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param energy int整型一维数组
* @return int整型
*/
public int maxEnergyCircular (int[] energy) {
// write code here
int n = energy.length;
int ans1; // 最大能量值
int[] dp1 = new int[n]; // 用于存储最大能量值的动态规划数组
ans1 = energy[0]; // 初始化最大能量值为第一个元素
for (int i = 0; i < n; i++) {
if (i == 0) {
dp1[i] = energy[i];
} else {
if (dp1[i - 1] >= 0) {
dp1[i] = energy[i] + dp1[i - 1];
} else {
dp1[i] = energy[i];
}
}
ans1 = Math.max(ans1, dp1[i]); // 更新最大能量值
}
int[] dp2 = new int[n]; // 用于存储另一种情况下的动态规划数组
int ans2 = 0; // 另一种情况下的最小能量值
for (int i = 1; i < n - 1; i++) {
dp2[i] = Math.min(energy[i], dp2[i - 1] + energy[i]);
ans2 = Math.min(ans2, dp2[i]); // 更新另一种情况下的最小能量值
}
int sum = 0; // 数组元素的总和
for (int i = 0; i < n; i++) {
sum += energy[i]; // 计算数组元素的总和
}
return Math.max(ans1, sum - ans2); // 返回较大的能量值作为结果
}
}
该代码使用的编程语言是Java。
该题考察的知识点是动态规划。
代码的解释如下:
maxEnergyCircular方法是计算循环数组的最大能量值的主要方法。- 代码中使用了两个动态规划数组
dp1和dp2。 dp1数组用于存储一种情况下的最大能量值,其中dp1[i]表示以第i个元素为结尾的子序列的最大能量值。dp2数组用于存储另一种情况下的最小能量值,其中dp2[i]表示以第i个元素为结尾的子序列的最小能量值。ans1表示最大能量值,初始值为第一个元素的能量值。- 第一个循环遍历数组,通过动态规划更新
dp1数组和ans1的值,得到一种情况下的最大能量值。 - 第二个循环遍历数组(从第二个元素开始到倒数第二个元素),通过动态规划更新
dp2数组和ans2的值,得到另一种情况下的最小能量值。 - 计算数组所有元素的总和存储在
sum变量中。 - 最后返回较大的能量值,即
Math.max(ans1, sum - ans2)。