力扣
关键点
- 从题目中总结出公式 sum * 2 +nums[i] =total
- 从左往右开始尝试,寻找 i 位置满足上面的公式,为什么从左开始,因为题目要求找到最左边的一个
- 用前缀和的概念来解,从左往右尝试i位置的左边所有数之和,右边所有数之和
学习关键词:
- 找数学公式
- 前缀和概念
- 尝试针对数组的方向
代码1
package algorithm.second.array.and.string.topic_1991;import java.util.Arrays;/*** link{https://leetcode.cn/problems/find-the-middle-index-in-array/description/}* 遍历每个元素两边的和是否相等,可以硬算* 先求总和,利用公司 2*sum+num[i] =total从左往右计算,先求总数这个很关键* <p>* 从左往右一个一个尝试* 逐个求nums[0]...nums[i-1]=sum 的和* 判断是否满足条件* 第一个满足的就是题目中满足条件的最左边的一个*/
class Solution {public int pivotIndex(int[] nums) {int total = Arrays.stream(nums).sum();int sum = 0;for (int i = 0; i < nums.length; ++i) {if (2 * sum + nums[i] == total) {return i;}sum += nums[i];}return -1;}public int pivotIndex2(int[] nums) {int total = 0;for (int k = 0; k < nums.length; k++) {total += nums[k];}int sum = 0;for (int i = 0; i < nums.length; i++) {//先比较,再累加,边界问题if (sum * 2 + nums[i] == total) {return i;}sum += nums[i];}return -1;}
}
代码2
package algorithm.second.array.and.string.topic_1991;/*** link{https://leetcode.cn/problems/find-the-middle-index-in-array/solutions/988569/1991zhao-dao-shu-zu-de-zhong-jian-wei-zh-e8cp/}* 其实本题考查的是前缀和,而下面的三种解法都是使用前缀和来解答问题。*/
public class Solution2 {public int findMiddleIndex(int[] nums) {for(int i = 0;i < nums.length; i++) {int sumLeft = sumLeft(i,nums);int sumRight = sumRight(i,nums);if(sumLeft==sumRight){return i;}}return -1;}private int sumLeft(int i, int[] nums) {int sumLeft = 0;for(int j=0;j<i;j++){sumLeft += nums[j];}return sumLeft;}private int sumRight(int i,int [] nums){int sumRight=0;for(int k=nums.length-1;k>i;k--){sumRight +=nums[k];}return sumRight;}
}