Java 递增数组中的数字,直到它们都相等

Java 递增数组中的数字,直到它们都相等,java,arrays,performance,increment,Java,Arrays,Performance,Increment,这个程序的目标是使数组中的所有数字都相同。除了每次增加一个值外,必须增加数组中的所有值。然后程序将打印出使所有数字相同所需的最小步骤数。我有一个我认为有效的解决方案,我只是想让它更有效率,有人有什么想法吗?在下面的代码中,用户将数字的初始值输入数组,然后计算所需的步数 public static void main(String[] args) throws NumberFormatException, IOException { counter=0; size=sc.nex

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

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;
}
publicstaticvoidmain(String[]args)抛出NumberFormatException,IOException
{
计数器=0;
尺寸=sc.nextInt();
输入=新整数[大小];

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


如果步骤是“递减一个值”,你能计算出使值相等的步骤数吗?它应该包括在数组中最多循环两次,并且没有排序。

主要编辑,因为我误读了问题

只需扫描列表一次,即可找到列表中的最小值以及所有值相加的总和

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

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

代码:

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;
}
公共静态int numberOfSteps(int[]a){
如果(a.length==0)返回0;
int min=a[0];
整数总计=a[0];
对于(int i=1;i(1,2,2,1)
2.增加除[2]-->(2,3,2,2)之外的所有值
3.增加除[1]-->(3,3,3,3):三步解=(1+1+1)-(4*0)之外的所有值

同样,(1,2,3,3)的初始状态

  • 增加除[3]-->(2,3,4,3)之外的所有值
  • 增加除[2]-->(3,4,4,4)之外的所有值
  • 增加除[3]-->(4,5,5,4)之外的所有值
  • 增加除[2]-->(5,6,5,5)之外的所有值
  • 除了[1]-->(6,6,6,6):五步求解法=(1+2+3+3)-(4*1)之外,所有值都递增

  • 在有关算法的问题中,您应该忽略处理用户输入。只需创建一个将所需值作为参数的函数,这样可读性就更好了。此外,
    isAllEqual()
    是一个主要的性能问题,排序也是不必要的。只需找到最大值一次,然后递增到最大值-如果知道算法将达到该值,则无需检查是否满足条件。是否必须这样做?为什么不在数组中循环找到最大和最小的数字,然后进行设置数组中的y槽到最大数。步长是最大-最小。诀窍是你必须增加数组中除一个以外的所有数,我认为这并不是那么简单。@sjr-事实上,如果你要实际增加(我不确定你是否需要这样做),那么您需要避免增加所有已经达到最大值的条目。我认为您的公式对列表(0,1,1,1)不起作用。公式说增加的数量应该是4*1-3=1,但没有一个步骤可以解决问题。啊-没有想到重复的最大值:-(@SimonG.如果增量变为其他增量,如2,5,这是如何变化的?很好的洞察力。这使得计算(以及解决方案的存在)相对明显。