1013-将数组分成和相等的三个部分
大约 2 分钟
给你一个整数数组 arr,只有可以将其划分为三个和相等的 非空 部分时才返回 true,否则返回 false。
形式上,如果可以找出索引 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]) 就可以将数组三等分。
示例 1:
输入:arr = [0,2,1,-6,6,-7,9,1,2,0,1]
输出:true
解释:0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1
示例 2:
输入:arr = [0,2,1,-6,6,7,9,-1,2,0,1]
输出:false
示例 3:
输入:arr = [3,3,6,5,-2,2,5,1,-9,4]
输出:true
解释:3 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4
提示:
3 <= arr.length <= 5 * 104
-104 <= arr[i] <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/partition-array-into-three-parts-with-equal-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
刚开始理解错了,以为是将数组里的元素分成三组,每组的和相同,后来仔细一看,是将数组分成三段,也就是在中间砍两刀,这下就简单多了,我们先计算出数组总和,再计算出每部分的和,然后用双指针从头和尾分别计算,达到目标后就停止。
public boolean canThreePartsEqualSum(int[] arr) {
int sum = Arrays.stream(arr).sum();
if (sum % 3 != 0) {
return false;
}
int part = sum / 3; //部分和
int left = 0;
int leftSum = 0;
while (left < arr.length) {
leftSum += arr[left];
if (leftSum == part) {
break;
}
left++;
}
if (left >= arr.length - 2) { //中间和尾部至少需要剩下两个元素
return false;
}
int right = arr.length - 1;
int rightSum = 0;
while (right >= left + 1) { //中间只要保留一个元素,所以right的下界是left+1
rightSum += arr[right];
if (rightSum == part) {
break;
}
right--;
}
if (rightSum == part && leftSum == part) { //如果两个部分满足了,那么剩下的也一定满足
return true;
}
return false;
}