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

查找最长的子阵列

宦源
2023-03-14

给定一个整数数组,包含不超过两个不同值的最长子数组的长度是多少,使得非重复值的差异不超过 1?

例:

arr = [0,1,2,1,2,3]

最大的子数组长度为4:[1,2,1,2]。

arr = [1, 1, 1, 3, 3, 2, 2]

最大的子阵列具有长度4:[3,3,2,2]。值1和3相差1以上,因此[1,1,1,3,3]无效。

共有3个答案

后阳炎
2023-03-14

我认为没有比O(n)更好的解决方案了。

你没有指定任何语言,所以伪代码应该是这样的(我最后写了一个python脚本):

a = [1, 1, 1, 3, 3, 2, 2]
max_solution_arr = []
cur_sol_arr = []
max_length = 0
cur_len = 0

def min_(a, a_i):
  if len(a) == 0:
      return a_i
  return min(a)

def max_(a, a_i):
  if len(a) == 0:
      return a_i
  return max(a)
for i, a_i in enumerate(a):
    if i == 0:
        cur_sol_arr.append(a_i)
        cur_len += 1
    else:
        if (abs(a[i] - min_(cur_sol_arr, a[i])) <= 1) and (abs(a[i] - max_(cur_sol_arr, a[i])) <= 1):
            # solution extend
            cur_sol_arr.append(a_i)
            cur_len += 1
        else:
            # we need to break, update solution
            if cur_len > max_length:
                max_length = cur_len
                max_solution_arr = cur_sol_arr[:] # make a copy here
                cur_sol_arr = [a_i] # delete
                cur_len = 1
# residual

if cur_len > max_length:
   max_length = cur_len
   max_solution_arr = cur_sol_arr # make a copy here

print(max_solution_arr)

这个想法是,您将保留一个数组,除非不满足条件(

澹台硕
2023-03-14

在这段代码中,我们一直查看当前元素之前的元素,检查它们的差是否不大于1,以及该元素是否在我们正在计数的子数组的当前范围内。最后,我们需要增加总数,因为我们需要数组的长度。

Python代码:

def longestSub(arr):
    size = len(arr)
    cMax = cMin = arr[0]
    total = current = 0

    cMax = cMin = arr[0]
    #We will use cMax and cMin to keep track of the range of our current subarray
    for i in range(1,size):
        if(abs(arr[i] - arr[i-1]) <= 1):
            if(arr[i] == cMax or arr[i] == cMin):
                current += 1
            else:
                if(current > total):
                    total = current
                current = 1
                cMax = max(arr[i-1],arr[i])
                cMin = min(arr[i-1],arr[i])
        else:
            if(current > total):
                total = current
            cMin = cMax = arr[i]
    return total+1

if __name__ == "__main__":
    arr = [0, 1, 2, 1, 2, 3]    #length = 4; [1,2,1,2]
    print(longestSub(arr))
    arr = [1, 2, 3, 4, 5]       #length = 2; [1,2]
    print(longestSub(arr))
    arr = [1, 1, 1, 3, 3, 2, 2] #length = 4; [3,3,2,2]
    print(longestSub(arr))
司信厚
2023-03-14

这里是O(1)空间,O(n)时间。通过查看可能包含较高元素的以< code>A[i-1]结尾的最佳序列,以及可能包含较低元素的以< code>A[i-1]结尾的最佳序列,我们可以得到以< code>A[i]结尾的序列的答案。

JavaScript代码:

function f(A){
  if (A.length < 2)
    return A.length;
    
  let best = 1;
  let bestLower = 1;
  let bestHigher = 1;
  
  for (let i=1; i<A.length; i++){
    if (A[i] == A[i-1]){
      bestLower = bestLower + 1;
      bestHigher = bestHigher + 1;
    
    } else if (A[i] - 1 == A[i-1]){
      bestLower = 1 + bestHigher;
      bestHigher = 1;
    
    } else if (A[i] + 1 == A[i-1]){
      bestHigher = 1 + bestLower;
      bestLower = 1;
    
    } else {
      bestLower = 1;
      bestHigher = 1;
    }

    best = Math.max(best, bestLower, bestHigher);
  }
  
  return best;
}

arrays = [
  [0, 1, 2, 1, 2, 3], // length = 4; [1,2,1,2]
  [1, 2, 3, 4, 5], // length = 2; [1,2]
  [1, 1, 1, 3, 3, 2, 2] // length = 4; [3,3,2,2]
];

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

  • 文件输入。txt由两行组成:第一行是整数N空格,然后是整数K(1 ≤ N、 K级≤ 250000). Second有N个空间除数的整数,其中每个整数都小于或等于K。保证从1到K的每个整数都在数组中。任务是找到包含所有整数的最小长度的子数组。并打印其开始和结束。请注意,索引从1开始。 示例: 我在最近的一次编程比赛中完成了这个任务。一切都结束了,我没有作弊。我已经使用python 3实现了它: 这个

  • http://articles.leetcode.com/2011/11/lengton-palindromic-substring-part-i.html 我处理这个问题的领域是用java编写代码,使用简单的强力解决方案,然后使用o(n2)方法,没有额外的空间,就像现在这样。http://www.geeksforgeeks.org/lengte-palindromic-substring-set

  • A是一个数组,B是A中所有元素的质因数阶,< code>size(A)=N (1 到目前为止,我还没有想过这个问题,所以没有什么成就,但是我保证我已经想了很久了,希望有帮助,谢谢!

  • 问题内容: 我正在尝试编写一种算法,用于在给定的子矩阵中查找子矩阵。为了解决这个问题,我编写了以下代码: 这段代码可以正常工作,但是我不确定这是问题的确切解决方案还是可以解决。请提供您的专家意见。提前致谢。 问题答案: 该算法对4×4矩阵和2×2子矩阵进行了硬编码。否则,它看起来像蛮力算法。 我会这样表示: 如果您想要更有效的方法,建议您将它们压扁,如下所示: 并在此序列中搜索以下模式: 使用标准

  • 我正在考虑这个leetcode问题,在完成这个天真的方法时遇到了一个问题。我在这里找到了一个最佳的解决方案。但我不确定我天真的尝试到底出了什么问题。 问题如下: 给定两个整数数组A和B,返回两个数组中出现的子数组的最大长度。 示例: 输入:A:[1,2,3,2,1]B:[3,2,1,4,7] 输出:3 说明:最大长度的重复子数组为[3,2,1]。 这是我当前的代码: 我的解决方案通过了几个测试用例