diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/README.md" index b04a79ba5b3de..61a7f927c2a86 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/README.md" @@ -60,7 +60,20 @@ -用前缀和进行预处理,避免重复计算 +**方法一:前缀和** + +我们定义变量 $left$ 表示数组 $nums$ 中下标 $i$ 左侧元素之和,变量 $right$ 表示数组 $nums$ 中下标 $i$ 右侧元素之和。初始时 $left = 0$, $right = \sum_{i = 0}^{n - 1} nums[i]$。 + +遍历数组 $nums$,对于当前遍历到的数字 $x$,我们更新 $right = right - x$,此时如果 $left=right$,说明当前下标 $i$ 就是中间位置,直接返回即可。否则,我们更新 $left = left + x$,继续遍历下一个数字。 + +遍历结束,如果没有找到中间位置,返回 $-1$。 + +时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $nums$ 的长度。 + +相似题目: + +- [1991. 找到数组的中间位置](/solution/1900-1999/1991.Find%20the%20Middle%20Index%20in%20Array/README.md) +- [2574. 左右元素和的差值](/solution/2500-2599/2574.Left%20and%20Right%20Sum%20Differences/README.md) @@ -71,13 +84,12 @@ ```python class Solution: def pivotIndex(self, nums: List[int]) -> int: - n = len(nums) - sum = [0 for _ in range(n + 1)] - for i in range(1, n + 1): - sum[i] = sum[i - 1] + nums[i - 1] - for i in range(0, n): - if sum[i] == sum[n] - sum[i + 1]: + left, right = 0, sum(nums) + for i, x in enumerate(nums): + right -= x + if left == right: return i + left += x return -1 ``` @@ -88,59 +100,79 @@ class Solution: ```java class Solution { public int pivotIndex(int[] nums) { - int n = nums.length; - int[] sum = new int[n + 1]; - for (int i = 1; i <= n; i++) { - sum[i] = sum[i - 1] + nums[i - 1]; + int left = 0, right = 0; + for (int x : nums) { + right += x; } - for (int i = 0; i < n; i++) { - if (sum[i] == sum[n] - sum[i + 1]) { + int n = nums.length; + for (int i = 0; i < n; ++i) { + right -= nums[i]; + if (left == right) { return i; } + left += nums[i]; } return -1; } } ``` +### **C++** + +```cpp +class Solution { +public: + int pivotIndex(vector& nums) { + int left = 0; + int right = accumulate(nums.begin(), nums.end(), 0); + int n = nums.size(); + for (int i = 0; i < n; ++i) { + right -= nums[i]; + if (left == right) { + return i; + } + left += nums[i]; + } + return -1; + } +}; +``` + ### **Go** ```go func pivotIndex(nums []int) int { - n := len(nums) - sum := make([]int, n+1) - for i := 1; i <= n; i++ { - sum[i] = sum[i-1] + nums[i-1] + left, right := 0, 0 + for _, x := range nums { + right += x } - for i := 0; i < n; i++ { - if sum[i] == sum[n]-sum[i+1] { + for i, x := range nums { + right -= x + if left == right { return i } + left += x } return -1 } ``` -### **C++** - -```cpp -class Solution { -public: - int pivotIndex(vector& nums) { - int sum = 0; - int total = 0; - for (int num : nums) - sum += num; - - for (int i = 0; i < nums.size(); i++) { - total += nums[i]; - if (total - nums[i] == sum - total) - return i; +### **TypeScript** + +```ts +function pivotIndex(nums: number[]): number { + let left = 0; + let right = nums.reduce((a, b) => a + b, 0); + const n = nums.length; + for (let i = 0; i < n; ++i) { + right -= nums[i]; + if (left === right) { + return i; } - - return -1; + left += nums[i]; } -}; + return -1; +} ``` ### **PHP** @@ -152,16 +184,14 @@ class Solution { * @return Integer */ function pivotIndex($nums) { - $sum = 0; - $pre = 0; - for ($i = 0; $i < count($nums); $i++) { - $sum += $nums[$i]; - } + $left = 0; + $right = array_sum($nums); for ($i = 0; $i < count($nums); $i++) { - if ($pre === $sum - $pre - $nums[$i]) { + $right -= $nums[$i]; + if ($left == $right) { return $i; } - $pre += $nums[$i]; + $left += $nums[$i]; } return -1; } diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.cpp" "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.cpp" index f6268bf4512e2..308e4e291eaeb 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.cpp" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.cpp" @@ -1,17 +1,16 @@ class Solution { public: int pivotIndex(vector& nums) { - int sum = 0; - int total = 0; - for (int num : nums) - sum += num; - - for (int i = 0; i < nums.size(); i++) { - total += nums[i]; - if (total - nums[i] == sum - total) + int left = 0; + int right = accumulate(nums.begin(), nums.end(), 0); + int n = nums.size(); + for (int i = 0; i < n; ++i) { + right -= nums[i]; + if (left == right) { return i; + } + left += nums[i]; } - return -1; } }; \ No newline at end of file diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.go" "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.go" index fbde90df33198..c638cfe4a95de 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.go" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.go" @@ -1,13 +1,14 @@ func pivotIndex(nums []int) int { - n := len(nums) - sum := make([]int, n+1) - for i := 1; i <= n; i++ { - sum[i] = sum[i-1] + nums[i-1] + left, right := 0, 0 + for _, x := range nums { + right += x } - for i := 0; i < n; i++ { - if sum[i] == sum[n]-sum[i+1] { + for i, x := range nums { + right -= x + if left == right { return i } + left += x } return -1 } \ No newline at end of file diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.java" "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.java" index 0a6921461910f..2354e6e002db1 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.java" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.java" @@ -1,15 +1,17 @@ -class Solution { - public int pivotIndex(int[] nums) { - int n = nums.length; - int[] sum = new int[n + 1]; - for (int i = 1; i <= n; i++) { - sum[i] = sum[i - 1] + nums[i - 1]; - } - for (int i = 0; i < n; i++) { - if (sum[i] == sum[n] - sum[i + 1]) { - return i; - } - } - return -1; - } -} +class Solution { + public int pivotIndex(int[] nums) { + int left = 0, right = 0; + for (int x : nums) { + right += x; + } + int n = nums.length; + for (int i = 0; i < n; ++i) { + right -= nums[i]; + if (left == right) { + return i; + } + left += nums[i]; + } + return -1; + } +} \ No newline at end of file diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.php" "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.php" index cbfbc3c030a37..56cc02bd2cafd 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.php" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.php" @@ -4,16 +4,14 @@ class Solution { * @return Integer */ function pivotIndex($nums) { - $sum = 0; - $pre = 0; + $left = 0; + $right = array_sum($nums); for ($i = 0; $i < count($nums); $i++) { - $sum += $nums[$i]; - } - for ($i = 0; $i < count($nums); $i++) { - if ($pre === $sum - $pre - $nums[$i]) { + $right -= $nums[$i]; + if ($left == $right) { return $i; } - $pre += $nums[$i]; + $left += $nums[$i]; } return -1; } diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.py" "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.py" index b568aaf7b479b..1edb93f459e19 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.py" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.py" @@ -1,10 +1,9 @@ -class Solution: - def pivotIndex(self, nums: List[int]) -> int: - n = len(nums) - sum = [0 for _ in range(n + 1)] - for i in range(1, n + 1): - sum[i] = sum[i - 1] + nums[i - 1] - for i in range(0, n): - if sum[i] == sum[n] - sum[i + 1]: - return i - return -1 +class Solution: + def pivotIndex(self, nums: List[int]) -> int: + left, right = 0, sum(nums) + for i, x in enumerate(nums): + right -= x + if left == right: + return i + left += x + return -1 diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.ts" "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.ts" new file mode 100644 index 0000000000000..9b34b007c458a --- /dev/null +++ "b/lcof2/\345\211\221\346\214\207 Offer II 012. \345\267\246\345\217\263\344\270\244\350\276\271\345\255\220\346\225\260\347\273\204\347\232\204\345\222\214\347\233\270\347\255\211/Solution.ts" @@ -0,0 +1,13 @@ +function pivotIndex(nums: number[]): number { + let left = 0; + let right = nums.reduce((a, b) => a + b, 0); + const n = nums.length; + for (let i = 0; i < n; ++i) { + right -= nums[i]; + if (left === right) { + return i; + } + left += nums[i]; + } + return -1; +}