一.题目:
LCR 012. 寻找数组的中心下标 - 力扣(LeetCode)
二.我的原始解法-暴力双重循环-提交成功:
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
# 暴力解法
# 双重循环 先计算全数组和,右边数组再依次遍历减去当前值 左边数组依次加上上一个值
left_sum, right_sum = 0, 0
n = len(nums)
for i in range(1,n):
right_sum += nums[i]
if left_sum == right_sum:
return 0
for j in range(1, n):
right_sum -= nums[j]
left_sum += nums[j - 1]
if left_sum == right_sum:
return j
return -1
三.其他人的正确及好的解法,力扣解法参考:
答案中提到的比较多的解法是前缀和,前缀和讲的比较清楚的:https://segmentfault.com/a/1190000045108831?sort=newest
四.对于别人解法的消化及总结:
前缀和的解法其实是从答案找解法,这道题对于时间复杂度没有要求,也没有使用通用查找算法,如我自己的暴力求解法也可以提交成功
前缀和的原理就是右一个隐藏条件是任意坐标的特点是左边和+中心坐标+右边和=数组和,而中心坐标的左边和=右边和,综合这两个条件可以
推导出2倍的左边和+中心坐标=数组和,所以先求数组和,然后找到符合这个条件的坐标返回即可,求数组和使用的是内置函数,只需要遍历一遍
数组找到符合条件的坐标,所以整体时间复杂度是O(n)(O(2n)也是O(n))。
相比我的暴力解法,还是前缀和比较简单
暴力解法提交:
前缀和解法提交: