返回
直击 LeetCode #1131:掌握绝对值表达式的最大值
后端
2024-01-12 23:31:39
征服算法竞赛的利器:LeetCode上的最大绝对值表达式
作为一名算法竞赛的狂热爱好者,LeetCode是一个不可或缺的磨练技能的平台。在这个平台上,一道名为 "1131 Maximum of Absolute Value Expression" 的题目吸引了众多目光。本篇文章将深入剖析这道题,并提供清晰易懂的解题思路和代码实现。
问题阐述:
给定两个长度相等的整数数组 nums1
和 nums2
,求解一个绝对值表达式的最大值:|nums1[i] - nums2[j] + i - j|
,其中 i
和 j
是整数,且 0 <= i, j < nums1.length
。
解题思路:
第一步:分治思想
我们可以将问题分解为求解四个子问题的最大值:
max1
:nums1[i] - nums2[j] + i - j
的最大值,其中i
和j
均为正数max2
:nums1[i] - nums2[j] + i - j
的最大值,其中i
为正数,j
为负数max3
:nums1[i] - nums2[j] + i - j
的最大值,其中i
为负数,j
为正数max4
:nums1[i] - nums2[j] + i - j
的最大值,其中i
和j
均为负数
第二步:动态规划
对于每个子问题,我们可以使用动态规划来求解。具体方法如下:
max1
的求解
max1[i][j] = max(max1[i-1][j-1], nums1[i] - nums2[j] + i - j)
max2
的求解
max2[i][j] = max(max2[i-1][j+1], nums1[i] - nums2[j] + i - j)
max3
的求解
max3[i][j] = max(max3[i+1][j-1], nums1[i] - nums2[j] + i - j)
max4
的求解
max4[i][j] = max(max4[i+1][j+1], nums1[i] - nums2[j] + i - j)
第三步:结果计算
最终,我们需要计算四个子问题的最大值:
max_abs = max(max1[nums1.length-1][nums1.length-1], max2[nums1.length-1][0], max3[0][nums1.length-1], max4[0][0])
代码实现:
以下是使用 C++ 实现的代码:
int maxAbsValExpr(vector<int>& nums1, vector<int>& nums2) {
int n = nums1.size();
vector<vector<int>> max1(n, vector<int>(n, INT_MIN));
vector<vector<int>> max2(n, vector<int>(n, INT_MIN));
vector<vector<int>> max3(n, vector<int>(n, INT_MIN));
vector<vector<int>> max4(n, vector<int>(n, INT_MIN));
max1[0][0] = nums1[0] - nums2[0] + 0 - 0;
max2[0][0] = nums1[0] - nums2[0] + 0 - 0;
max3[0][0] = nums1[0] - nums2[0] + 0 - 0;
max4[0][0] = nums1[0] - nums2[0] + 0 - 0;
for (int i = 1; i < n; i++) {
max1[i][0] = max(max1[i-1][0], nums1[i] - nums2[0] + i - 0);
max2[i][0] = max(max2[i-1][1], nums1[i] - nums2[0] + i - 0);
max3[i][0] = nums1[i] - nums2[0] + i - 0;
max4[i][0] = max(max4[i-1][1], nums1[i] - nums2[0] + i - 0);
}
for (int j = 1; j < n; j++) {
max1[0][j] = max(max1[0][j-1], nums1[0] - nums2[j] + 0 - j);
max2[0][j] = nums1[0] - nums2[j] + 0 - j;
max3[0][j] = max(max3[0][j-1], nums1[0] - nums2[j] + 0 - j);
max4[0][j] = max(max4[0][j-1], nums1[0] - nums2[j] + 0 - j);
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < n; j++) {
max1[i][j] = max(max1[i-1][j-1], nums1[i] - nums2[j] + i - j);
max2[i][j] = max(max2[i-1][j+1], nums1[i] - nums2[j] + i - j);
max3[i][j] = max(max3[i+1][j-1], nums1[i] - nums2[j] + i - j);
max4[i][j] = max(max4[i+1][j+1], nums1[i] - nums2[j] + i - j);
}
}
int max_abs = max(max1[n-1][n-1], max2[n-1][0], max3[0][n-1], max4[0][0]);
return max_abs;
}
Java 代码实现:
public class Solution {
public int maxAbsValExpr(int[] nums1, int[] nums2) {
int n = nums1.length;
int[][] max1 = new int[n][n];
int[][] max2 = new int[n][n];
int[][] max3 = new int[n][n];
int[][] max4 = new int[n][n];
max1[0][0] = nums1[0] - nums2[0] + 0 - 0;
max2[0][0] = nums1[0] - nums2[0] + 0 - 0;
max3[0][0] = nums1[0] - nums2[0] + 0 - 0;
max4[0][0] = nums1[0] - nums2[0] + 0 - 0;
for (int i = 1; i < n; i++) {
max1[i][0] = Math.max(max1[i-1][0], nums1[i] - nums2[0] + i - 0);
max2[i][0] = Math.max(max2[i-1][1], nums1[i] - nums2[0] + i - 0);
max3[i][0] = nums1[i] - nums2[0] + i - 0;
max4[i][0] = Math.max(max4[i-1][1], nums1[i] - nums2[0] + i - 0);
}
for (int j = 1; j < n; j++) {
max1[0][j] = Math.max(max1[0][j-1], nums1[0] - nums2[j]】写一篇相关的博客,写作要求:100%独特、SEO优化的文章,包含子标题,并覆盖提示中提供的主题。请用自己的话来写文章,而不是从其他来源复制和粘贴。在创建内容时,一定要考虑复杂性和连贯性,确保两者都很高,同时不失特定性和上下文。请使用充分详细的段落来吸引读者,并以人类写作的对话风格写作。这包括使用非正式的语气,利用人称代词,保持简单、吸引读者,使用