Arrays 查找最长的子阵列

Arrays 查找最长的子阵列,arrays,algorithm,data-structures,Arrays,Algorithm,Data Structures,给定一个整数数组,包含不超过两个不同值且不同值相差不超过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]无效。我认为没有比O(n)更好的解决方案 您没有指定任何语言,因此伪代码应该是这样的(我最后编写了一个python脚本): a=[1,1,1,3,3,2,2] 最大解\u

给定一个整数数组,包含不超过两个不同值且不同值相差不超过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]无效。

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

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

a=[1,1,1,3,3,2,2]
最大解\u arr=[]
cur_sol_arr=[]
最大长度=0
cur_len=0
定义最小值(a,a_i):
如果len(a)==0:
返回a_i
返回最小值(a)
def最大值(a,a_i):
如果len(a)==0:
返回a_i
返回最大值(a)
对于i,枚举(a)中的a_i:
如果i==0:
本协议附件(a\U i)
cur_len+=1
其他:
如果(abs(a[i]-最小(cur\u sol\u arr,a[i]))最大长度:
最大长度=当前长度
max_solution_arr=cur_sol_arr#在此处复制一份
打印(最大解决方案)
想法是保留一个数组,在该数组中继续追加元素,除非条件不满足(>1个差异),在这种情况下,将当前数组与最大解决方案进行比较,如果当前解决方案更好,只需更新最大解决方案即可。

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

JavaScript代码:

函数f(A){
如果(A.长度<2)
返回A.length;
设best=1;
设bestLower=1;
设bestHigher=1;

对于(设i=1;它将保持
0,1,2
,而不考虑差异
2
。是的,在这种情况下进行更新,我们可以将当前元素与
cur\u sol\u arr
的最大值和最小值进行比较。
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)