题目连接: 力扣
自己编写的答案及测试函数:
想法:先求出初识索引下左值和右值,然后遍历求中心索引。
#include<stdio.h>
int pivotIndex(int* nums, int numsSize)
{
int left_val = 0;
int right_val = 0;
int index = 0;
int match_flag = 0;
int media_index = 0;
for (index = 1; index < numsSize; index++)
{
right_val += nums[index];
}
for (index = 0; index < numsSize; index++)
{
if (left_val == right_val)
{
match_flag = 1;
break;
}
if ((index + 1) == numsSize)
{
break;
}
left_val += nums[index];
right_val -= nums[index + 1];
}
media_index = match_flag == 1 ? index : -1;
return media_index;
}
int main()
{
//int arr[6] = { 1, 7, 3, 6, 5, 6 };
//int arr[3] = {1, 2, 3};
int arr[3] = { 2, 1, -1 };
int media_index = 0;
int arr_len = sizeof(arr) / sizeof(int);
media_index = pivotIndex(arr, arr_len);
printf("media_index = %d\n", media_index);
return 0;
}
时间复杂度有点高啊,没有提前返回。好在代码可读性还在。。。
评论区里大部分同学的想法都是这样,只是处理方式略有不同。
只有一个同学使用了点技巧,使用判断条件: 左值*3+索引值 == 数组元素和
不得不说短小精悍,但是可能正常人一下子理解不了,可能要思索1分钟。。。
int pivotIndex(int *nums, int numsSize)
{
int i, totalNums = 0, leftNums = 0;
for (i = 0; i < numsSize; i++)
totalNums += nums[i] ;
for (i = 0; i < numsSize; i++)
{
if (leftNums * 2 + nums[i] == totalNums)
return i;
leftNums += nums[i];
}
return -1;
}