【问题标题】:increment numbers in an array until they are all equal [closed]递增数组中的数字,直到它们都相等[关闭]
【发布时间】:2013-01-01 22:45:37
【问题描述】:

该程序的目标是使数组中的所有数字都相同。您必须每次递增数组中的所有值,除了一个。然后程序将打印出使所有数字相同所需的最少步数。我有一个我认为是可行的解决方案,我只是想让它更有效率,有人有什么想法吗?在下面的代码中,用户将数字的初始值输入到数组中,然后计算所需的步数

public static void main(String[] args) throws NumberFormatException, IOException 
{
counter=0;
         size=sc.nextInt();
         input= new int[size];
        for(int k=0; k<size; k++)
        {
            input[k]=sc.nextInt();
        }
        while(!isAllEqual(input))
        {
            Arrays.sort(input);
            for(int k=0; k<input.length-1; k++)
            {
                input[k]++;
            }
            counter++;
        }
        pw.println(counter);

public static boolean isAllEqual(int[] a){
    for(int i=1; i<a.length; i++){
        if(a[0] != a[i]){
            return false;
        }
    }
return true;
}

【问题讨论】:

  • 在有关算法的问题中,您应该省略处理用户输入。只需创建一个将所需值作为参数的函数,这样就更具可读性。
  • 另外,isAllEqual() 是一个主要的性能损失,也不需要排序。只需找到最大值一次,然后递增到那个值 - 如果您知道您的算法会到达那里,则无需检查您是否满足条件。
  • 一定要这样吗?为什么不循环遍历数组以找到最大和最小的数字,然后将 arra 中的每个插槽设置为最大的数字。步数最大 - 最小。
  • 诀窍是你必须递增数组中除一个以外的所有数字,我认为这并不简单。
  • @sjr - 实际上,如果您要实际增加(我不确定您是否需要这样做),那么您需要避免增加 all 条目已经达到最大值。

标签: java arrays performance increment


【解决方案1】:

如果您将步骤更改为更简单的内容,可能会更容易理解这一点。如果我们只讨论值之间的相等性(即相对值,而不是绝对值),那么同时增加和减少 all 的值没有区别。如果我们将步骤更改为“除一之外的所有值都递增,然后每个值减一”,我们可以看到除一之外的所有值都递增等于递减单个值。

如果步骤是“减一值”,你能算出使值相等的步骤数吗?它应该涉及在最大处循环数组两次,并且不进行排序。

【讨论】:

  • 不错的见解。它使计算(以及解决方案的存在)相对明显。
【解决方案2】:

在我误读问题时进行重大编辑

只扫描一次列表,找出列表中的最小值和所有值相加的总和。

获得这两个值后,所需的增量数为:

[所有值的总和] - [列表中的项目数] * [最小值]

在代码中:

public static int numberOfSteps(int[] a) {
    if( a.length==0 ) return 0;

    int min= a[0];
    int total = a[0];
    for(int i=1;i<a.length;i++) {
        if( a[i] < min ) min = a[i];
        total += a[i];
    }

    return total - a.length * min;
}

这是有效的,因为(正如 Matti Virkkunen 指出的那样)每个项目的递减数是 (a[i] - min ),所以对于整个列表,它是 sum(a[i]-min),我们可以将其扩展为 sum(a[i]-(length*min)

相应的增量将在每一步增加所有内容,除了最右边的项目,它等于最大值。例如:

初始状态 = (0,1,1,1) 1. 递增除 a[3] --> (1,2,2,1) 之外的所有内容 2. 递增除 a[2] --> (2,3,2,2) 之外的所有内容 3. 增加除了 a[1] --> (3,3,3,3) 之外的所有内容:三步解决方案 = (1+1+1) - (4 * 0)

再一次,(1,2,3,3) 的初始状态

  1. 增加除 a[3] 之外的所有内容 --> (2,3,4,3)
  2. 增加除 a[2] 之外的所有内容 --> (3,4,4,4)
  3. 增加除 a[3] 之外的所有内容 --> (4,5,5,4)
  4. 增加除 a[2] 之外的所有内容 --> (5,6,5,5)
  5. 增加除 a[1] 之外的所有内容 --> (6,6,6,6) :五步解决方案 = (1+2+3+3) - (4 * 1)

【讨论】:

  • 我认为您的公式不适用于列表 (0, 1, 1, 1)。公式说增量的数量应该是 4*1 - 3 = 1,但是没有一个步骤可以解决问题。
  • 啊 - 没想到重复的最大值:-(
  • @SimonG。如果增量更改为其他增量,例如 2、5,这将如何变化?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多