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

求连续差=k的数组中的子序列总数

端木涵润
2023-03-14

在给定的数组中,我试图找到子序列的总数,以便:

  • 连续各学期差额不大于3
  • 子序列的第一个元素是数组的第一个元素
  • 子序列的最后一个元素是数组的最后一个元素

例如,在数组:[10,13,7,8,14,200, 876, 11]中,它有5个遵循上述条件的子序列。

我正在尝试一种自下而上的方法。我尝试了以下方法,但它没有给出所有子序列和输出4,而不是5。

我该怎么做?我的直觉是,这种方法可能类似于最长的递增子序列,但不确定如何实现。

共有3个答案

姬成荫
2023-03-14

我刚刚注意到@Abhinav的答案是将解决方案优化为O(K*N),而不是O(N^2),这对小的K很有效
但如果需要最佳解决方案,我建议使用O(N*log2(N))解决方案,在log2(N)中使用段树或二叉索引树(Fenwick树)查找[x-k,x k]范围内的和,其中范围和查询(RSQ)是这两种数据结构提供的标准操作

如果初始数组中的值很大(比如long或double),则可以借助映射来进行数据压缩
在这种方法中,你不需要担心K,即使它太大。

公羊兴文
2023-03-14

@VFX已经提出了一个O(N^2)解决方案,但在大多数情况下,优化算法将是首选。这里有一个O(K*N)解决方案
假设子序列中的第一个元素是x。下一个元素必须在[x-k,x k]范围内。如果知道该范围内所有值的有效序列数,也可以在O(K)中找到当前元素的答案
更正式地说,算法是:

arr = []              // your list
counter = {}          // a dictionary or hashmap to keep count of sequences
counter[arr[-1]] = 1
for i in range (len(arr)-2 to 0):
    curr_element = a[i]
    sequences = 0
    for x in range (curr_element-k to curr_element+k):
        sequences += counter[x]
    counter[curr_element] += sequences

final_answer = counter[arr[0]]
东方权
2023-03-14

设f(i)为满足以下条件的子序列数:

  • 由A[0]开始
  • 以A[i]结尾
  • 连续项之间的差额不大于3

那么你的问题的答案将是f(A.length()-1)。

下面是C语言中自下而上的代码:

int A[] = {10,13,7,8,14,11};
int f[6];
int n = 6;
    
for (int i=0;i<n;i++) f[i] = 0;
f[0]=1;
for (int i=1;i<n;i++){
  for (int j=0;j<i;j++){
     if (abss(A[i] - A[j]) <= 3)
         f[i] += f[j];
  }
}
cout<<f[n-1]<<endl;//printing the result

以下是用C语言自上而下编写的代码:

int A[] = {10,13,7,8,14,11};
int n = 6;

int memo[6];//initialized with -1s;

int count(int currIndex){
  if (currIndex == n-1) return 1;
  if (memo[currIndex] != -1) return memo[currIndex];
  
  int res = 0;
  for (int i=currIndex+1 ; i<n ; i++){
      if (abss(A[currIndex] - A[i]) <= 3){
            res += count(i);
      }
  }
    
  memo[currIndex] = res;
  return res;
}

结果是在第一个索引处调用count,如下所示:

count(0);
 类似资料:
  • 你好,我正在尝试从IEEEXtreme 2014解决这个问题: 给你N个循环排列的整数。有N种方法可以拾取长度为M(M)的连续子序列 我的方法是首先创建一个排序数组列表,将新输入插入正确的位置。我将前M个整数添加到列表中。记录第K个最小值。然后我继续删除最旧的整数并将下一个整数添加到列表中,并将新的第K个值与旧的值进行比较。这是我的排序数组列表。 我认为这种蛮力方法效率不高,但还不能想出任何想法。

  • 我是爪哇新手,正在练习。我正在写一个程序来查找给定整数数组中的所有连续子数组。为了简单起见,我从键盘插入输入(每个数字在新的行中),表示数组末尾的是一个负整数。 最后,我试着用这个方法找到连续整数的第一个序列,这不完全是我的目标,但我从更简单的事情开始,然后我会用这个方法找到所有的连续序列: 这两种方法都在同一个类中声明和实现。 问题是我输入的序列是我希望是打印的,但我得到的输出是。我尝试使用pr

  • 给定一个大小为n的非递减数组a和一个整数k,如何找到数组a的一个子序列S,其元素的最大可能和,使得这个和最多为k。如果有多个这样的子序列,我们只想找到一个。 例如,让数组为{1,2,2,4},n=4,k=7。那么,答案应该是{1,2,4}。 蛮力方法大约需要O(n(2^n-1))但是有更有效的解决方案吗?

  • 本文向大家介绍求一个数组中连续子向量的最大和相关面试题,主要包含被问及求一个数组中连续子向量的最大和时的应答技巧和注意事项,需要的朋友参考一下 考察点:数组    

  • 本文向大家介绍C ++中最小K总和最短的子数组,包括了C ++中最小K总和最短的子数组的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个数组A。我们必须找到A的最短,非空,连续子数组的长度,其总和至少为K。如果没有这样的子数组,则返回-1。 因此,如果输入类似于[5,3,-2,2,1]且k = 6,则输出将为2,如我们所见(5 + 3)> = 6 为了解决这个问题,我们将遵循以下步骤- n:

  • 我有2个输入 预期输出: 我无法解决它。所以,请不要问我的解决方案。请用java帮助解决。