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

具有所有相同元素的最长子数组的长度

咸亦
2023-03-14

我有这个问题:

您将获得一个整数 A 和一个整数 k 的数组。您可以将 A 的元素递减到 k 次,目标是生成一个元素都相等的连续子数组。返回可以用这种方式生成的最长的连续子数组的长度。

例如,如果 A 是 [1,7,3,4,6,5] 并且 k 是 6,那么您可以生成 [1,7,3,4-1,6-1-1-1,5-1-1] = [1,7,3,3,3,3],因此您将返回 4。

最佳解决方案是什么?

共有2个答案

林丁雷
2023-03-14
def cost(a, i, j):
  n = j - i 
  s = 0
  m = a[i]
  for k in range(i,j):
    s += a[k]
    m = min(m, a[k])
  return s - n * m;

def solve(n,k,a):
 m=1
 for i in range(n):
  for j in range(i,n+1):
   if cost(a,i,j)<=k:
    x = j - i 
    if x>m:
     m=x
 return m

这是我的python3解决方案,符合您的规范。

澹台阳秋
2023-03-14

子数组必须等于其最低成员,因为唯一允许的操作是减少(减少最低成员会增加不必要的成本)。给定:

a1, a2, a3...an

要降低的成本是:

sum(a1..an) - n * min(a1..an)

例如

3, 4, 6, 5
sum = 18
min = 3
cost = 18 - 4 * 3 = 6

将复杂度从 O(n^2) 降低到对数因子的一种方法是:对于每个元素作为候选最佳子数组的最右边(或最左边)元素,二叉搜索成本内的最长长度。为此,我们只需要总和,我们可以从 O(1) 中的前缀总和、长度(我们已经在搜索)和最小范围查询中获得,这是经过充分研究的。

作为对这篇文章下面的评论的回应,这里有一个演示,当我们从最右边的每个元素扩展一个子数组时,成本序列单调增加,因此可以用二分搜索法查询。

JavaScript代码:

function cost(A, i, j){
  const n = j - i + 1;
  let sum = 0;
  let min = Infinity;
  for (let k=i; k<=j; k++){
    sum += A[k];
    min = Math.min(min, A[k]);
  }
  return sum - n * min;
}

function f(A){
  for (let j=0; j<A.length; j++){
    const rightmost = A[j];
    const sequence = [];
    
    for (let i=j; i>=0; i--)
      sequence.push(cost(A, i, j));
    
    console.log(rightmost + ': ' + sequence);
  }
}

var A = [1,7,3,1,4,6,5,100,1,4,6,5,3];

f(A);
 类似资料:
  • 给定一个整数N和一个长度为N的数组,该数组由0到N-1的整数组成,可能包含也可能不包含所有整数,也可能包含重复数。查找一个从索引i到索引j的子数组(i, j),使其包含数组中的所有整数,并且具有最小长度。输出是这样一个子数组的长度 示例:A=[2,1,1,3,2,1,1,3],因此最小子数组长度=3,因为A[2]到A[4]包含所有数字 我的想法: 维护一个计数器数组和两个索引开始和结束,其中包含数

  • 本文向大家介绍查找所有元组在Python中是否具有相同的长度,包括了查找所有元组在Python中是否具有相同的长度的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将找出给定列表中的所有元组是否具有相同的长度。 与伦 我们将使用len函数并将其结果与我们正在验证的给定值进行比较。如果值相等,那么我们认为它们的长度相同,否则就不一样。 示例 输出结果 运行上面的代码给我们以下结果- 与所有人和

  • 问题内容: 给出了长度为 n 的数组。查找子数组元素的乘积之和。 说明 数组 A* = 长度 3的 [2,3,4] 。 * 长度为 2的 子数组= [2,3],[3,4],[2,4] [2,3] 中元素的乘积= 6 [3,4] 中元素的乘积= 12 [2,4] 中元素的乘积= 8 长度 2 = 6 + 12 + 8 = 26的子数组的总和 同样,对于长度 3 ,Sum = 24 因此,乘积以模 1

  • 假设我们有一个数组 {7, 3, 7, 3, 1, 3, 4, 1}。我需要的是一个算法(最好是一些 C 代码示例),它将返回包含数组所有元素的最小子数组的长度。 在这种情况下,它将是 5:{7, 3, 1, 3, 4},这是原始数组的最短子数组,其中包含数组的所有元素,即 1、3、4 和 7。 此外,数组 {2, 1, 1, 3, 2, 1, 1, 3} 的另一个示例,算法应返回 3,因为我们正

  • 问题内容: 我想知道什么是实现此目标的最佳方法。 想不出一种好方法来保存需要保存的信息,例如索引和值的数量,最后是要重复的实际数量 问题答案: 您可以使用2D ArrayList,其声明如下: 然后在过程结束时声明要添加到其中的2个ArrayList: 然后 1)遍历列表,检查元素是否与先前相同。 如果是的话,请进行到最后,否则将发现一个不同的元素,此时在ArrayList中将先前相等元素的数量存

  • 例如:如果数组是[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来解决这类问题吗?多谢了。