【发布时间】:2019-05-22 20:40:00
【问题描述】:
找到要删除的子数组的开始和结束索引以使给定数组具有相等的左侧和右侧总和的 C 程序。如果它不可能打印-1。我需要它适用于任何阵列,这只是为了测试。这是找到平衡的代码。
#include <stdio.h>
int equilibrium(int arr[], int n)
{
int i, j;
int leftsum, rightsum;
/* Check for indexes one by one until
an equilibrium index is found */
for (i = 0; i < n; ++i) {
/* get left sum */
leftsum = 0;
for (j = 0; j < i; j++)
leftsum += arr[j];
/* get right sum */
rightsum = 0;
for (j = i + 1; j < n; j++)
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
int main()
{
int arr[] = { -7, 1, 5, 2, -4, 3, 0 };
int arr_size = sizeof(arr) / sizeof(arr[0]);
printf("%d", equilibrium(arr, arr_size));
getchar();
return 0;
}
【问题讨论】:
-
听起来是个有趣的问题。到目前为止你尝试过什么?
-
要移除一个元素,需要让它移除子数组。
-
所以简单的 O(n^2) 答案是两个嵌套的
for循环。外循环迭代起始索引,内循环迭代结束索引(必须等于或大于开始)。 -
我想我应该提到总和应该逐步更新。例如,
leftSum以arr[0]开头。每次起始索引增加时,leftSum都会更新为leftSum += arr[start]。为了在内循环中工作,内循环必须反向运行(从数组的末尾开始,向后遍历数组,直到到达起始索引)。 -
你能用C++
stdlib吗?
标签: c arrays optimization big-o sub-array