检查数组左侧的和是否等于o(n)中数组的右侧

时间:2017-01-30 19:13:10

标签: java arrays algorithm sum time-complexity

我得到了一个数字数组(整数),如果右边的数字总和等于o(n)中左边大小的数字之和,我需要返回该元素。

例如数组{1,2,2,9,3,2} 程序应打印9,因为1 + 2 + 2 = 5和3 + 2 = 5

我附上了我的代码,但这不是o(n)复杂性。 感谢你的帮助。

感谢。

public class Program {
    public static void checkIfEqualOption1(int[] arr){
        int sumRight = 0;
        int sumLeft=0;
        //sumRight+=numbers[0];
        for (int i=0; i < arr.length; i++){
            if (i>0){
                sumRight+=arr[i-1];
                for (int j=i+1; j<arr.length; j++){
                    sumLeft+=arr[j];
                }
                if (sumRight==sumLeft){
                    System.out.println("\nFound = "+arr[i]);
                    break;
                }
            }
        }

    }

    public static void print(int[] arr){
        for (int i=0; i < arr.length; i++){
            System.out.print(arr[i] + " ");
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("Hi");
        int[] numbers = {1,2,2,9,3,2};
        System.out.println("Array numbers:");
        for (int i=0; i < numbers.length; i++){
            System.out.print(numbers[i] + " ");
        }
        System.out.println("\n");
        checkIfEqualOption1(numbers);
    }
}

8 个答案:

答案 0 :(得分:4)

首先观察每个<template *ngFor="let col of cols" let-col> <kendo-grid-column [ngSwitch]="col.name"> <template *ngSwitchCase="'listen'" kendoGridCellTemplate let-dataItem let-column> <button kendoButton (click)="open(dataItem)" style="width:180">{{dataItem.station.text}}</button> </template> <template *ngSwitchDefault kendoGridCellTemplate let-dataItem let-column> </template> </kendo-grid-column> </template>

i

所以

arraySum(0, i) + arraySum(i+1, n) == arrayTotal

在第一遍中计算arraySum(i+1, n) == arrayTotal - arraySum(0, i); ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ Sum on the right Sum on the left ;然后从左边走数组,计算部分和。

到达某个位置后停止
arrayTotal

答案 1 :(得分:1)

这应该适用于O(n),您不需要对数组进行排序:

public class Program {

    public static void checkIfEqualOption1(int[] arr){

        int sumTotal=0;
        for (int i=0; i < arr.length; i++){ // O(arr.length)
            sumTotal += arr[i];
        }

        int sumRight = 0;
        int sumLeft=0;
        for (int i=1; i < arr.length-1; i++){ // O(arr.length)
            sumLeft += arr[i-1];
            sumRight = sumTotal - arr[i] - sumLeft;
            if (sumRight == sumLeft){
                System.out.println("\nFound = "+arr[i]);
                break;
            }
        }
   }


   public static void main(String[] args) {

     int[] numbers = {1,2,2,9,3,2};
     System.out.println("Array numbers:");
     for (int i=0; i < numbers.length; i++){
          System.out.print(numbers[i] + " ");
     }
     System.out.println("\n");
     checkIfEqualOption1(numbers);
   }

}

输出:

Array numbers:
1 2 2 9 3 2


Found = 9

答案 2 :(得分:0)

我想出了这个解决方案,它根据左下位置([:]posFromLeft在下面的代码中的增量来计算两个总和),直到这些位置超过&#34;交叉&#34;彼此(posFromRight不再满足):

posFromRight > posFromLeft

答案 3 :(得分:0)

我写了下面的代码来检查LHS和RHS数组项的总和是否相等。 getMidIndex()将返回找到相等的数组索引....

public class Concepts {

public static int getMidIndex(int[] elements) throws Exception {
    int endIndex = elements.length - 1;
    int startIndex = 0, sumL = 0, sumR = 0;

    while (true) {
        if (sumL > sumR)
            sumR += elements[endIndex--];
        else
            sumL += elements[startIndex++];
        System.out.println("StartIndex: " + startIndex + " Endindex: " + endIndex + " SumLeft: " + sumL
                + " SumRight: " + sumR);
        if (sumL == sumR)
            break;
        if (startIndex > endIndex) {
            System.out.println("Invalid Array");
            break;
        }
    }
    return endIndex;
}

public static void main(String[] args) throws Exception {
    int[] array = { 1, 2, 2, 9, 3, 2 };
    int midVal = getMidIndex(array);
    System.out.println("Mid index: " + midVal + " Value: " + array[midVal]);
}

}

答案 4 :(得分:0)

 void balanceArray(int[] arr){
    int[] leftArray;
    int[] rightArray;
    for(int i=0; i<arr.length; i++){

        leftArray=Arrays.copyOfRange(arr,0, i+1);
        rightArray = Arrays.copyOfRange(arr,i+1, arr.length);
        int sumofLeft= sumOfArray(leftArray);
        int sumofRight = sumOfArray(rightArray);

        if(sumofLeft==sumofRight  && sumofLeft!=0){
            int L=leftArray.length;
            int R=rightArray.length;
            return;
        }

    }

sumOfArray(...)方法如下。

 private int sumOfArray(int[] arr){
    int sum=0;
    for(int no:arr){
        sum+=no;
    }
    return sum;
}

答案 5 :(得分:0)

public void printMiddleIndex(int [] arr){

    int endidx = arr.length-1; // End index
    int startidx = 0; // Start index
    int ssum =arr[0]; // sum from left end 'start sum'
    int esum =arr[endidx]; // sum from right end 'end sum'

    while(true) {
        System.out.println("Ssum : "+ssum+" Esum : "+esum+"  Sindex : "+startidx+"  Eindex  : "+endidx);
        if(ssum>esum) 
            esum += arr[--endidx];
        else if(ssum<esum) 
            ssum += arr[++startidx];
        else if(ssum==esum) {
            if(startidx == endidx-1) {
                System.out.println("MiddleIndex : "+endidx);
                break;
            }
            else    
                ssum += arr[++startidx];
        }
        else if(startidx > endidx-1) {
            System.out.println("Array is not good");
        }
    }

}

答案 6 :(得分:0)

这是Python中的解决方案。我用过列表切片。在O(n)中运行的空间复杂度最低。这里的“ l”是输入数组。

for i in range(len(l)-1):
if sum(l[0:i+1])==sum(l[i+2:]):
    print(l[i+1])

答案 7 :(得分:0)

在 Javascript 中实现,但适用相同的逻辑。这是 O(n) 解决方案:

//returns the index or -1 if not equal sides
function findIndexIfArrayHasEqualSides(arr) {
  const sum = arr.reduce((acc, num) => acc += num);
  let sumLeft = 0;
  let sumRight = 0;

  for (let i = 0; i < arr.length; i++) {
    const currentVal = arr[i];
    sumRight = sum - sumLeft - currentVal;

    if (sumLeft === sumRight) {
      return i;
    }

    sumLeft += currentVal;
  }

  return -1;
}