给你一个整数数组 nums
,如果 nums
至少 包含 2
个元素,你可以执行以下操作中的 任意 一个:
- 选择
nums
中最前面两个元素并且删除它们。 - 选择
nums
中最后两个元素并且删除它们。 - 选择
nums
中第一个和最后一个元素并且删除它们。
一次操作的 分数 是被删除元素的和。
在确保 所有操作分数相同 的前提下,请你求出 最多 能进行多少次操作。
请你返回按照上述要求 最多 可以进行的操作次数。
示例 1:
输入:nums = [3,2,1,2,3,4] 输出:3 解释:我们执行以下操作: - 删除前两个元素,分数为 3 + 2 = 5 ,nums = [1,2,3,4] 。 - 删除第一个元素和最后一个元素,分数为 1 + 4 = 5 ,nums = [2,3] 。 - 删除第一个元素和最后一个元素,分数为 2 + 3 = 5 ,nums = [] 。 由于 nums 为空,我们无法继续进行任何操作。
示例 2:
输入:nums = [3,2,6,1,4] 输出:2 解释:我们执行以下操作: - 删除前两个元素,分数为 3 + 2 = 5 ,nums = [6,1,4] 。 - 删除最后两个元素,分数为 1 + 4 = 5 ,nums = [6] 。 至多进行 2 次操作。
代码:
class Solution {
int[] nums;
int[][] memo;
public int maxOperations(int[] nums) {
int n = nums.length;
this.nums = nums;
this.memo = new int[n][n];
int res = 0;
res = Math.max(res, helper(0, n - 1, nums[0] + nums[n - 1]));
res = Math.max(res, helper(0, n - 1, nums[0] + nums[1]));
res = Math.max(res, helper(0, n - 1, nums[n - 2] + nums[n - 1]));
return res;
}
public int helper(int i, int j, int target) {
for (int k = 0; k < nums.length; k++) {
Arrays.fill(memo[k], -1);
}
return dfs(i, j, target);
}
public int dfs(int i, int j, int target) {
if (i >= j) {
return 0;
}
if (memo[i][j] != -1) {
return memo[i][j];
}
int ans = 0;
if (nums[i] + nums[i + 1] == target) {
ans = Math.max(ans, dfs(i + 2, j, target) + 1);
}
if (nums[j - 1] + nums[j] == target) {
ans = Math.max(ans, dfs(i, j - 2, target) + 1);
}
if (nums[i] + nums[j] == target) {
ans = Math.max(ans, dfs(i + 1, j - 1, target) + 1);
}
memo[i][j] = ans;
return ans;
}
}//此代码转载于力扣官方
日记:这是8号的题目,也就是昨天,哈哈昨天《地下蚁国》正式版发售,就忘记写力扣了。这一题是7号那题的加强版,我的想法卡在分情况后代码一定会超时,只能参考力扣官方的题解。等一会再去看看今天的题,提前祝大家端午快乐。
狗狗想提升自己的算法能力,加油吧。
今日分享: