C++程序 数组平衡点的程序
编写一个函数 int equilibrium(int[] arr, int n)
,它会给定大小为n的序列arr[],返回一个平衡点的索引(如果存在),否则返回-1。数组的平衡点是这样一个索引,使得较低的索引处的元素的总和等于较高的索引处元素的总和。例如,在一个数组A中:
示例:
输入 : A[] = {-7, 1, 5, 2, -4, 3, 0}
输出 : 3
3是平衡点,因为:
A[0] + A[1] + A[2] = A[4] + A[5] + A[6]
输入 : A[] = {1, 2, 3}
输出 : -1
方法1(简单但效率低)
使用两个循环。外部循环遍历所有元素,内部循环可以找出外部循环选择的当前索引是否是平衡点或者不是。
输出
时间复杂度: O(n^2)
辅助空间: O(1)
方法2(巧妙而高效)
首先获取整个数组的总和。然后遍历数组并保持初始化为零的左侧和。在循环中,可以通过逐个减去元素来得到右侧和。感谢Sambasiva提供了这个解决方案和代码。
1)初始化leftsum为0
2)将数组的总和作为sum
3)遍历数组,对于每个索引i,执行以下操作。
a) 更新sum以获得右部分和。
sum = sum- arr[i]
//现在sum是右部分和
b) 如果leftsum等于sum,则返回当前索引。
//更新leftsum以进行下一次迭代。
c) leftsum = leftsum + arr[i]
4)返回-1
// 如果没有找到平衡点则退出循环
下面是上述方法的实现:
这个图像展示了上述方法的详细运行过程:
下面是上述方法的实现:
时间复杂度: O(N)
辅助空间: O(N)