题解 | #牛群的最大能量环# 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)
。