题目难度:简单
主要提升:(1)for循环思想(2)数组基本操作(3)问题拆解能力。
一、题目描述:
给一个整数数组 nums ,如果 nums 至少包含 2 个元素,你可以执行以下操作:
选择 nums 中的前两个元素并将它们删除。
一次操作的分数是被删除元素的和。
在确保所有操作分数相同的前提下,请你求出最多能进行多少次操作。
返回按照上述要 最多可以进行的操作次数。
二、示例:
示例 1:
输入:nums = [3,2,1,4,5]
输出:2
解释:我们执行以下操作:
- 删除前两个元素,分数为 3 + 2 = 5 ,nums = [1,4,5] 。
- 删除前两个元素,分数为 1 + 4 = 5 ,nums = [5] 。
由于只剩下 1 个元素,我们无法继续进行任何操作。
示例 2:
输入:nums = [3,2,6,1,4]
输出:1
解释:我们执行以下操作:
- 删除前两个元素,分数为 3 + 2 = 5 ,nums = [6,1,4] 。
由于下一次操作的分数与前一次不相等,我们无法继续进行任何操作。
三、思路详解:
对于这个题目,很容易就被数组删除的操作所迷惑,但是实际上,我们只用关注程序所需要输出的值,输出所需要的计算其实并不需要有删除的操作,因此我们可以看做使用0索引值与1索引值的和与数组内后续两个两个数的和的比较,只需要对循环开始定义为2即可进行计算。我将写两种解答。
四、代码(我写了两种解法)
代码1:
public class Daily1 {public static void main(String[] args) {int[] nums = {3,2,1,3,5,0,1,4};System.out.println(maxTime(nums));}public static int maxTime(int[] nums) {int sum = 0;int sumTemp = 0;int Times = 1;if (nums.length<2){Times = 0;}for (int i = 2; i < nums.length-1; i+=2) {sum = nums[0] + nums[1];sumTemp = nums[i] +nums[i+1];if (sumTemp==sum){Times++;}else {break;}}return Times;}
}
代码2:
public class MaxOperations {public int maxOperations(int[] nums) {if (nums.length < 2) {return 0;}int[] prefixSum = new int[nums.length];prefixSum[0] = nums[0];// 计算前缀和for (int i = 1; i < nums.length; i++) {prefixSum[i] = prefixSum[i - 1] + nums[i];}int maxOperations = 0;// 遍历所有可能的子数组for (int i = 0; i < nums.length; i++) {for (int j = i + 2; j < nums.length; j++) {// 计算当前子数组的和int subarraySum = prefixSum[j] - prefixSum[i];// 如果子数组的和等于前两个元素的和,则更新最大操作次数if (subarraySum == nums[i] + nums[i + 1]) {maxOperations = Math.max(maxOperations, j - i);}}}return maxOperations;}public static void main(String[] args) {MaxOperations solution = new MaxOperations();// 示例System.out.println(solution.maxOperations(new int[]{3,2,1,4,5})); // 输出:2System.out.println(solution.maxOperations(new int[]{3,2,6,1,4})); // 输出:1}
}
以上就是今天的每日一题,如有问题可以评论区交流讨论。