1013. Partition Array Into Three Parts With Equal Sum
Если задан массив целых чисел arr, верните true, если мы можем разбить массив на три непустые части с равными суммами. Формально, мы можем разбить массив, если можем найти индексы i + 1 < j с (arr[0] + arr[1] + ... + arr[i] == arr[i + 1] + arr[i + 2] + ... + arr[j - 1] == arr[j] + arr[j + 1] + ... + arr[arr.length - 1])
Пример:
Input: arr = [0,2,1,-6,6,-7,9,1,2,0,1]
Output: true
C# решение
сопоставлено/оригиналpublic class Solution {
public bool CanThreePartsEqualSum(int[] arr) {
int totalSum = arr.Sum();
if (totalSum % 3 != 0) {
return false;
}
int target = totalSum / 3, partSum = 0, count = 0, n = arr.Length;
for (int i = 0; i < n; i++) {
partSum += arr[i];
if (partSum == target) {
count++;
partSum = 0;
if (count == 2 && i < n - 1) {
return true;
}
}
}
return false;
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public bool CanThreePartsEqualSum(vector<int>& arr) {
int totalSum = arr.Sum();
if (totalSum % 3 != 0) {
return false;
}
int target = totalSum / 3, partSum = 0, count = 0, n = arr.size();
for (int i = 0; i < n; i++) {
partSum += arr[i];
if (partSum == target) {
count++;
partSum = 0;
if (count == 2 && i < n - 1) {
return true;
}
}
}
return false;
}
}
Java решение
auto-draft, проверить перед отправкойimport java.util.*;
import java.math.*;
// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class Solution {
public boolean CanThreePartsEqualSum(int[] arr) {
int totalSum = arr.Sum();
if (totalSum % 3 != 0) {
return false;
}
int target = totalSum / 3, partSum = 0, count = 0, n = arr.length;
for (int i = 0; i < n; i++) {
partSum += arr[i];
if (partSum == target) {
count++;
partSum = 0;
if (count == 2 && i < n - 1) {
return true;
}
}
}
return false;
}
}
JavaScript решение
сопоставлено/оригиналclass Solution {
canThreePartsEqualSum(arr) {
const totalSum = arr.reduce((sum, num) => sum + num, 0);
if (totalSum % 3 !== 0) {
return false;
}
const target = totalSum / 3;
let partSum = 0, count = 0;
for (let i = 0; i < arr.length; i++) {
partSum += arr[i];
if (partSum === target) {
count++;
partSum = 0;
if (count === 2 && i < arr.length - 1) {
return true;
}
}
}
return false;
}
}
Python решение
сопоставлено/оригиналclass Solution:
def canThreePartsEqualSum(self, arr: List[int]) -> bool:
total_sum = sum(arr)
if total_sum % 3 != 0:
return False
target = total_sum // 3
part_sum, count, n = 0, 0, len(arr)
for i in range(n):
part_sum += arr[i]
if part_sum == target:
count += 1
part_sum = 0
if count == 2 and i < n - 1:
return True
return False
Go решение
сопоставлено/оригиналfunc canThreePartsEqualSum(arr []int) bool {
totalSum := 0
for _, num := range arr {
totalSum += num
}
if totalSum % 3 != 0 {
return false
}
target := totalSum / 3
partSum, count, n := 0, 0, len(arr)
for i := 0; i < n; i++ {
partSum += arr[i]
if partSum == target {
count++
partSum = 0
if count == 2 && i < n - 1 {
return true
}
}
}
return false
}
Algorithm
Вычисление общей суммы:
Вычислите общую сумму всех элементов массива. Если эта сумма не делится на 3 без остатка, вернуть false, так как невозможно разбить массив на три части с равной суммой.
Поиск первой и второй части:
Итерируйте по массиву и ищите первую часть с суммой, равной одной трети от общей суммы. Продолжайте итерацию для поиска второй части с такой же суммой.
Убедитесь, что между первой и второй частью есть хотя бы один элемент.
Проверка третьей части:
Убедитесь, что оставшаяся часть массива также имеет ту же сумму, что и две найденные части. Если да, вернуть true, иначе false.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.