力扣
關鍵點
- 從題目中總結出公式? 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;}
}