当前位置: 首页 > 知识库问答 >
问题:

重复子阵列的最大长度(leetcode)

朱海超
2023-03-14

我正在考虑这个leetcode问题,在完成这个天真的方法时遇到了一个问题。我在这里找到了一个最佳的解决方案。但我不确定我天真的尝试到底出了什么问题。

问题如下:

给定两个整数数组A和B,返回两个数组中出现的子数组的最大长度。

示例:
输入:A:[1,2,3,2,1]B:[3,2,1,4,7]

输出:3

说明:最大长度的重复子数组为[3,2,1]。

这是我当前的代码:

var findLength = function(a, b) {
    if (a.length === 0 || b.length === 0) {
        return 0;
    }
    
    let aWithoutFinalNumber = a.slice(0, a.length - 1);
    let bWithoutFinalNumber = b.slice(0, b.length - 1);

    let aFinalNumber = a[a.length - 1];
    let bFinalNumber = b[b.length - 1];
    
    // matching numbers
    if(aFinalNumber === bFinalNumber) {
        return 1 + findLength(aWithoutFinalNumber, bWithoutFinalNumber);
    } else { // mismatch. Compete to find the maximum length.
        return Math.max(findLength(a, bWithoutFinalNumber), findLength(aWithoutFinalNumber, b));
    }
};

我的解决方案通过了几个测试用例,但在诸如a:[0,1,1,1,1]b:[1,0,1,0,1]之类的情况下失败。如果您能了解我的错误,我们将不胜感激!

共有3个答案

潘高岑
2023-03-14

您也可以将dp与表一起使用。我尝试了另一个代码,它在以下情况下给出了错误:[0,0,0,0,1,0,0]和[0,0,0,0,0,1,0]。这里有一个相同的python代码。

def findLength(a, b):
    if len(a)==0 or len(b)==0:
        return 0
        
    n=len(a)
    m=len(b)

    dp=[[0 for _ in range(n+1)] for _ in range(m+1)]
    maxSoFar=0
       
    for i in range(1,m+1):
        for j in range(1,n+1):
            if a[j-1]==b[i-1]:
                dp[i][j]=dp[i-1][j-1]+1
                maxSoFar=max(maxSoFar,dp[i][j])
            else:
                dp[i][j]=0
                    
    return maxSoFar

龚钧
2023-03-14

可以使用嵌套循环,当两个数组中出现相同的元素时,可以开始递增这两个索引,直到两个数组中的元素相同。给出最大元素集的结果将是返回的结果。

function maxSub(a, b) {
  let result = null;

  function findAll(i, j) {
    const res = [];

    if (a[i] !== b[j] || a[i] == undefined || b[j] == undefined) {
      return res;
    }

    return res.concat(a[i], ...findAll(i + 1, j + 1))
  }

  a.forEach((e, i) => {
    b.forEach((c, j) => {
      if (e == c) {
        const sub = findAll(i, j);

        if (!result || sub.length > result.length) {
          result = sub
        }
      }
    })
  })

  return result;
}


console.log(maxSub([0, 1, 1, 1, 1], [1, 0, 1, 0, 1]))
console.log(maxSub([1, 2, 3, 2, 1], [3, 2, 1, 4, 7]))
巫马庆
2023-03-14

问题来自于计算最后一个元素匹配时的最大长度的方式。下面是一个简单的示例:

var findLength = function(a, b) {
    if (a.length === 0 || b.length === 0) {
        return 0;
    }

    let aWithoutFinalNumber = a.slice(0, a.length - 1);
    let bWithoutFinalNumber = b.slice(0, b.length - 1);

    let aFinalNumber = a[a.length - 1];
    let bFinalNumber = b[b.length - 1];

    // matching numbers
    if(aFinalNumber === bFinalNumber) {
        return 1 + findLength(aWithoutFinalNumber, bWithoutFinalNumber); //< -- problem here
    } else { // mismatch. Compete to find the maximum length.
        return Math.max(findLength(a, bWithoutFinalNumber), findLength(aWithoutFinalNumber, b));
    }
};

console.log(findLength([1, 0, 2, 1], [1, 0, 3, 1]));
 类似资料:
  • 有人能为下面的问题提出一个简单的解决方案吗? 最长子数组:查找子数组中元素之和小于或等于“k”的最长连续子数组的长度。 输入为:< code>array和< code>k。 例子: 输出: 2个 解释: 子数组:{1},{2},}3},1,2},2,3},{1,2,3} {1,2} =

  • 我从leet code https://leet code . com/problems/Maximum-Sum-of-Two-Non-Overlapping-Subarrays/中看到“两个非重叠子数组的最大和(特定给定长度,数组只包含正数)”。 但我遇到了这个问题的一个变体——“两个非重叠子数组(任意长度)的最大和,并且该数组包含正数和负数”。我看不到任何编码平台有这个问题需要我确认我的解决方

  • 我有一个正整数数组。例如: 一个“约简操作”找到平均值最高的数组前缀,并将其删除。这里,数组前缀是指左端为数组开始的连续子数组,如上面的或或。通过取较长的前缀来打破联系。 我将重复缩减操作,直到阵列为空: 现在,实际上执行这些数组修改是没有必要的;我只是在寻找这个过程将删除的前缀长度列表,例如上面的。 计算这些前缀长度的有效算法是什么? 最简单的方法是重新计算算法的每次迭代中的所有总和和平均值——

  • 例如:如果数组是[9,8,7,6,5,4,3,1,2,2],它应该返回46(长度为7的子数组[9,8,7,6,5,4,3]和长度为2的子数组[2,2]之和)。不能组合[9,8,7,6,5,4,3]和[1,2,2],因为这将产生长度为10的非素数的连续子数组(幂等性)。 有谁能解释一下如何使用DP来解决这类问题吗?多谢了。

  • 给定一个整数数组,包含不超过两个不同值的最长子数组的长度是多少,使得非重复值的差异不超过 1? 例: 最大的子数组长度为4:[1,2,1,2]。 最大的子阵列具有长度4:[3,3,2,2]。值1和3相差1以上,因此[1,1,1,3,3]无效。

  • 我试图在c中实现最长公共子序列算法,矩阵c[]]存储最长公共子序列的长度,行[][]存储c[]]矩阵中的父块行,列[][]存储父块列。 我对解决LCS的方法非常不便和低效表示歉意,但什么都没有打印出来。请帮忙。