获取二维数组的最大和

时间:2019-05-24 17:38:29

标签: java multidimensional-array

有一个二维数组。 bar foobar baz。我想获得每一列的总和并获得最大数量。最后应将其返回int[][] arr= {{1,3,4,1},{5,7,8,9},{6,1,2,1}}。因为它具有最大的总和。我已经在下面提到了我尝试过的代码,但未返回正确的值。帮我解决这个问题

5 个答案:

答案 0 :(得分:3)

您的k应该以最大的总和来跟踪索引。因此,当您重置最大值时,您需要说k=i。您误说了i=k。更改它可以使程序按需要运行。

编辑:最初的问题中曾经有此解决方案所引用的代码。

答案 1 :(得分:1)

如果需要max列,那么我可能有解决方案:

import java.util.Arrays;

public class ArrayTest {
    public static void main(String args[]) {
        /*
         * 1 3 4 1 
         * 5 7 8 9 
         * 6 1 2 1
         * 
         */


        int[][] arr = {{1, 3, 4, 1}, {5, 7, 8, 9}, {6, 1, 2, 1}};



        int m = arr.length;
        int n = arr[0].length;
        int[] arr2 = new int[n];
        int p = 0;

        int[][] colArray = new int[n][m];

        for (int i = 0; i < n; i++) {
            int[] arr_i = new int[m];
            //System.out.println("i = " + i);
            //System.out.println("p = " + p);
            int sum = 0;
            for (int j = 0; j < m; j++) {
                arr_i[j] = arr[j][p];
                sum += arr_i[j];
            }
            //System.out.println("Col: " + p + " : " + Arrays.toString(arr_i));
            colArray[i] = arr_i;
            arr2[p] = sum;
            p++;

        }
        System.out.println("Sum: " + Arrays.toString(arr2));
        int k = 0;
        int max = arr2[0];
        for (int i = 0; i < 3; i++) {
            if (arr2[i] > max) {
                max = arr2[i];
                k = i;
            }
        }
        System.out.println("Column index for max: " + k);
        System.out.println("Column: " + Arrays.toString(colArray[k]));
    }
}

输出:

Sum: [12, 11, 14, 11]
Column index for max: 2
Column: [4, 8, 2]

答案 2 :(得分:0)

我建议您找到一种方法,将问题分解为较小的部分,使用功能解决每个部分,然后将所有内容组合为解决方案。

以下示例解决方案:

public class Main {

  public static long sum(int[] a){
    long sum = 0;
    for (int i : a) {
      sum = sum + i;
    }
    return sum;
  }

  public static int[] withMaxSumOf(int[][] as){
    // keep one sum for each array
    long[] sums = new long[as.length];

    // calculate sums
    for (int i = 0; i < as.length; i++) {
      int[] a = as[i];
      sums[i] = sum(a);
    }

    // find the biggest one
    int maxIndex = 0;
    long maxSum = sums[0];
    for (int i=1;i<sums.length;i++){
      if (sums[i] > maxSum){
        maxSum = sums[i];
        maxIndex = i;
      }
    }

    // return array that had biggest sum
    return as[maxIndex];

  }

  public static void main(String[] args){

    int[][] arr= {{1,3,4,1},{5,7,8,9},{6,1,2,1}};

    // find the one with max sum
    int[] max = withMaxSumOf(arr);

    // print it
    for (int i = 0; i < max.length; i++) {
      int x = max[i];
      if (i > 0) System.out.print(", ");
      System.out.print(x);
    }

    System.out.println();

  }

}

答案 3 :(得分:0)

我认为这可能是您的问题:

for(int i=0;i<3;i++) {
    if(arr2[i]>max) {
        max=arr2[i];
        i=k;
    }
}

我认为i = k确实需要为k = i。

还请注意,使用更好的变量名是值得的。例如,索引而不是i。什么是k?将其称为“ indexForHighestSum”或类似名称。不必那么长,但是k是一个毫无意义的名称。

此外,您可以将求和循环与最高查找循环组合在一起。

最后,我可能会这样写:

public class twoDMax {
  public static void main(String args[]) {
    int[][] arr= { {1,3,4,1}, {5,7,8,9}, {6,1,2,1} };
    int indexForMaxRow = 0;
    int previousMax = 0;

    for(int index = 0; index < 4; ++index) {
        int sum = 0;
        for(int innerIndex = 0; innerIndex < 4; ++innerIndex) {
            sum += arr[index][innerIndex];
        }
        if (sum > previousMax) {
            previousMax = sum;
            indexForMaxRow = index;
    }

    System.out.println(indexForMaxRow);
    for(int index = 0; index < 4; ++index) {
        System.out.println(arr[indexForMaxRow][index]);
    }
  }
}

我做了其他一些时尚的事情。我使用了更明显的变量名。而且我对空白要好一些,这使代码更易于阅读。

答案 4 :(得分:-1)

public static void main( String args[] ) {
    int[][] arr = { { 1, 3, 4, 1 }, { 5, 7, 8, 9 }, { 6, 1, 2, 1 } };

    int indexOfMaxSum = 0;
    int maxSum = 0;

    for ( int i = 0; i < arr.length; i++ ) {
        int[] innerArr = arr[ i ]; // grab inner array
        int sum = 0; // start sum at 0
        for ( int j : innerArr ) {
            // iterate over each int in array
            sum += j; // add each int to sum
        }
        if ( sum > maxSum ) {
            // if this sum is greater than the old max, store it
            maxSum = sum;
            indexOfMaxSum = i;
        }
    }

    System.out.println( String.format( "Index %d has the highest sum with a sum of %d", indexOfMaxSum, maxSum ) );
    int [] arrayWithLargestSum = arr[indexOfMaxSum]; // return me

}