Java 窗口k算法的最大和子数组未正确返回起始索引

Java 窗口k算法的最大和子数组未正确返回起始索引,java,arrays,algorithm,sub-array,Java,Arrays,Algorithm,Sub Array,这是我的maxSum子数组代码 给定输入数组->[110,-4,3,6,7,11]和k=3,代码应给出[110,-4,3],因为这是具有最大和的子数组 我已经实现了这个算法。它适用于除一个输入之外的所有输入。我不知道出了什么问题 public class MaxSumSizeK { private static int getMaxAvgSubarrayStartIndex(int input[], int k) { int n = i

这是我的maxSum子数组代码

给定输入数组->[110,-4,3,6,7,11]和k=3,代码应给出[110,-4,3],因为这是具有最大和的子数组

我已经实现了这个算法。它适用于除一个输入之外的所有输入。我不知道出了什么问题

public class MaxSumSizeK {


        private static int getMaxAvgSubarrayStartIndex(int input[], int k)
        {
            int n = input.length;
            if (k > n)
                throw new IllegalArgumentException("k should be less than or equal to n" );      
            if(k == n) {
                return 0;    
            }

            int sum = input[0];
            for (int i = 1; i < k; i++)
                sum += input[i];

            int maxSum = sum;
            int maxSumIndex = 0;

            for (int i = k; i < n; i++){
                sum = sum - input[i-k] + input[i] ;
                if (sum > maxSum){
                    maxSum = sum;
                    maxSumIndex = i-k;
                }
            }
            return maxSumIndex+1;
        }

        public static void printMaxAvgSubarray(int[] input, int k) {
            System.out.print("Maximum average subarray of length "  + k + " is:  " );
            int index = getMaxAvgSubarrayStartIndex(input, k);
            for(int i =0 ; i < k; i++) {
                System.out.print(input[index++] + " " );
            }
        }

        public static void main(String[] args) {
            int[] input = {11, -8, 16, -7, 24, -2, 300};
            int k = 3;
            printMaxAvgSubarray(input, k);
            System.out.println();
            int[] input1 = {110, -8, 16, -7, 24, -2, 3};
            printMaxAvgSubarray(input1, k);
            System.out.println();
            int[] input2 = {11, -8, 16, -7, 24, -2, 3};
            printMaxAvgSubarray(input2, k);
            System.out.println();
        }
    }
对于输入1,我看不到预期的答案应该是“110,-8,16”。我尝试将return语句改为“maxSumIndex”,而不是“maxSumIndex+1”。这会打断其他两个输入

请提供您的想法

有两个错误:

  • maxSumIndex=i-k应该是
    maxSumIndex=i-k+1i-k-它是前一个数组的第一个索引,而不是当前的最大索引
  • 返回maxSumIndex+1
    应该是
    返回maxSumIndex如果索引为0(即前3项为最大值),则返回1,这是错误的
  • 试试这个:

            int n = input.length;
            if (k > n)
                throw new IllegalArgumentException("k should be less than or equal to n" );
            if (k < 1)
                throw new IllegalArgumentException("k should be greater than 0" );      
            if(k == n) {
                return 0;    
            }
    
            int sum = 0;
            for (int i = 0; i < k; i++)
                sum += input[i];
    
            int maxSum = sum;
            int maxSumIndex = 0;
    
            for (int j = 1; j < n-k; j++){
                sum = 0;
                for (int i = 0; i < k; i++){
                    sum = sum + (int) Math.abs(input[i+j]);
                }
                if (sum > maxSum){
                    maxSum = sum;
                    maxSumIndex = i-k;
                }
            } 
            return maxSumIndex;
    
    int n=input.length;
    如果(k>n)
    抛出新的IllegalArgumentException(“k应小于或等于n”);
    if(k<1)
    抛出新的IllegalArgumentException(“k应大于0”);
    如果(k==n){
    返回0;
    }
    整数和=0;
    for(int i=0;i最大总和){
    最大和=和;
    maxSumIndex=i-k;
    }
    } 
    返回maxSumIndex;
    
    为什么[110,-4,3]是[110,-4,3,6,7,11]的最大和?您的期望看起来像是要打印出第一项。@NikolasCharalambidis可能是连续数字的唯一子集?所以你不能到处乱跳?但是,是的,我想知道这是数组中3个元素的最大和,
    110,-4,3,6,7,11
    110+11+7
    ,它是
    128
    ,所以我问..@nikolasharalalambidis:它是子数组,意味着它是连续的。110,11,7不是连续的您可以使用一个for循环而不是嵌套循环
            int n = input.length;
            if (k > n)
                throw new IllegalArgumentException("k should be less than or equal to n" );
            if (k < 1)
                throw new IllegalArgumentException("k should be greater than 0" );      
            if(k == n) {
                return 0;    
            }
    
            int sum = 0;
            for (int i = 0; i < k; i++)
                sum += input[i];
    
            int maxSum = sum;
            int maxSumIndex = 0;
    
            for (int j = 1; j < n-k; j++){
                sum = 0;
                for (int i = 0; i < k; i++){
                    sum = sum + (int) Math.abs(input[i+j]);
                }
                if (sum > maxSum){
                    maxSum = sum;
                    maxSumIndex = i-k;
                }
            } 
            return maxSumIndex;