我得到了一个数字数组(整数),如果右边的数字总和等于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);
}
}
答案 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;
}