用于数组平衡索引的 Python3 程序
数组的平衡索引是这样一个索引,使得较低索引处的元素之和等于较高索引处的元素之和。例如,在数组 A 中:
例子 :
Input: A[] = {-7, 1, 5, 2, -4, 3, 0}
Output: 3
3 is an equilibrium index, because:
A[0] + A[1] + A[2] = A[4] + A[5] + A[6]
Input: A[] = {1, 2, 3}
Output: -1
写一个函数int balance(int[] arr, int n) ;给定大小为 n 的序列 arr[],返回平衡索引(如果有),如果不存在平衡索引,则返回 -1。
方法一(简单但低效)
使用两个循环。外循环遍历所有元素,内循环确定外循环选取的当前索引是否为平衡索引。该解决方案的时间复杂度为 O(n^2)。
Python3
# Python program to find equilibrium
# index of an array
# function to find the equilibrium index
def equilibrium(arr):
leftsum = 0
rightsum = 0
n = len(arr)
# Check for indexes one by one
# until an equilibrium index is found
for i in range(n):
leftsum = 0
rightsum = 0
# get left sum
for j in range(i):
leftsum += arr[j]
# get right sum
for j in range(i + 1, n):
rightsum += arr[j]
# if leftsum and rightsum are same,
# then we are done
if leftsum == rightsum:
return i
# return -1 if no equilibrium index is found
return -1
# driver code
arr = [-7, 1, 5, 2, -4, 3, 0]
print (equilibrium(arr))
# This code is contributed by Abhishek Sharama
Python3
# Python program to find the equilibrium
# index of an array
# function to find the equilibrium index
def equilibrium(arr):
# finding the sum of whole array
total_sum = sum(arr)
leftsum = 0
for i, num in enumerate(arr):
# total_sum is now right sum
# for index i
total_sum -= num
if leftsum == total_sum:
return i
leftsum += num
# If no equilibrium index found,
# then return -1
return -1
# Driver code
arr = [-7, 1, 5, 2, -4, 3, 0]
print ('First equilibrium index is ',
equilibrium(arr))
# This code is contributed by Abhishek Sharma
Python3
# Python program to find the equilibrium
# index of an array
# Function to find the equilibrium index
def equilibrium(arr):
left_sum = []
right_sum = []
# Iterate from 0 to len(arr)
for i in range(len(arr)):
# If i is not 0
if(i):
left_sum.append(left_sum[i-1]+arr[i])
right_sum.append(right_sum[i-1]+arr[len(arr)-1-i])
else:
left_sum.append(arr[i])
right_sum.append(arr[len(arr)-1])
# Iterate from 0 to len(arr)
for i in range(len(arr)):
if(left_sum[i] == right_sum[len(arr) - 1 - i ]):
return(i)
# If no equilibrium index found,then return -1
return -1
# Driver code
arr = [-7, 1, 5, 2, -4, 3, 0]
print('First equilibrium index is ',
equilibrium(arr))
# This code is contributed by Lokesh Sharma
3
时间复杂度: O(n^2)
方法2(棘手且高效)
这个想法是首先获得数组的总和。然后遍历数组并不断更新初始化为零的左和。在循环中,我们可以通过将元素一一相减得到正确的和。感谢 Sambasiva 提出这个解决方案并为此提供代码。
1) Initialize leftsum as 0
2) Get the total sum of the array as sum
3) Iterate through the array and for each index i, do following.
a) Update sum to get the right sum.
sum = sum - arr[i]
// sum is now right sum
b) If leftsum is equal to sum, then return current index.
// update leftsum for next iteration.
c) leftsum = leftsum + arr[i]
4) return -1
// If we come out of loop without returning then
// there is no equilibrium index
下图显示了上述方法的试运行:
下面是上述方法的实现:
Python3
# Python program to find the equilibrium
# index of an array
# function to find the equilibrium index
def equilibrium(arr):
# finding the sum of whole array
total_sum = sum(arr)
leftsum = 0
for i, num in enumerate(arr):
# total_sum is now right sum
# for index i
total_sum -= num
if leftsum == total_sum:
return i
leftsum += num
# If no equilibrium index found,
# then return -1
return -1
# Driver code
arr = [-7, 1, 5, 2, -4, 3, 0]
print ('First equilibrium index is ',
equilibrium(arr))
# This code is contributed by Abhishek Sharma
First equilibrium index is 3
输出:
第一个均衡指数是 3
时间复杂度: O(n)
方法3:
这是一种非常简单直接的方法。这个想法是两次获取数组的前缀和。一次来自阵列的前端,另一个来自阵列的后端。
在获取两个前缀和后,运行一个循环并检查一些 i,如果一个数组的前缀和都等于第二个数组的前缀和,那么该点可以被认为是平衡点。
Python3
# Python program to find the equilibrium
# index of an array
# Function to find the equilibrium index
def equilibrium(arr):
left_sum = []
right_sum = []
# Iterate from 0 to len(arr)
for i in range(len(arr)):
# If i is not 0
if(i):
left_sum.append(left_sum[i-1]+arr[i])
right_sum.append(right_sum[i-1]+arr[len(arr)-1-i])
else:
left_sum.append(arr[i])
right_sum.append(arr[len(arr)-1])
# Iterate from 0 to len(arr)
for i in range(len(arr)):
if(left_sum[i] == right_sum[len(arr) - 1 - i ]):
return(i)
# If no equilibrium index found,then return -1
return -1
# Driver code
arr = [-7, 1, 5, 2, -4, 3, 0]
print('First equilibrium index is ',
equilibrium(arr))
# This code is contributed by Lokesh Sharma
First Point of equilibrium is at index 3
时间复杂度: O(N)
空间复杂度: O(N)
有关详细信息,请参阅有关数组的 Equilibrium index 的完整文章!