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;
}
}