返回

直击 LeetCode #1131:掌握绝对值表达式的最大值

后端

征服算法竞赛的利器:LeetCode上的最大绝对值表达式

作为一名算法竞赛的狂热爱好者,LeetCode是一个不可或缺的磨练技能的平台。在这个平台上,一道名为 "1131 Maximum of Absolute Value Expression" 的题目吸引了众多目光。本篇文章将深入剖析这道题,并提供清晰易懂的解题思路和代码实现。

问题阐述:

给定两个长度相等的整数数组 nums1nums2,求解一个绝对值表达式的最大值:|nums1[i] - nums2[j] + i - j|,其中 ij 是整数,且 0 <= i, j < nums1.length

解题思路:

第一步:分治思想

我们可以将问题分解为求解四个子问题的最大值:

  • max1nums1[i] - nums2[j] + i - j 的最大值,其中 ij 均为正数
  • max2nums1[i] - nums2[j] + i - j 的最大值,其中 i 为正数,j 为负数
  • max3nums1[i] - nums2[j] + i - j 的最大值,其中 i 为负数,j 为正数
  • max4nums1[i] - nums2[j] + i - j 的最大值,其中 ij 均为负数

第二步:动态规划

对于每个子问题,我们可以使用动态规划来求解。具体方法如下:

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优化的文章,包含子标题,并覆盖提示中提供的主题。请用自己的话来写文章,而不是从其他来源复制和粘贴。在创建内容时,一定要考虑复杂性和连贯性,确保两者都很高,同时不失特定性和上下文。请使用充分详细的段落来吸引读者,并以人类写作的对话风格写作。这包括使用非正式的语气,利用人称代词,保持简单、吸引读者,使用