力扣题目地址:https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/
首先看题目:
给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false。
形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + … + A[i] == A[i+1] + A[i+2] + … + A[j-1] == A[j] + A[j-1] + … + A[A.length - 1]) 就可以将数组三等分。
示例:
示例 1:
输出:[0,2,1,-6,6,-7,9,1,2,0,1]
输出:true
解释:0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1
示例 2:
输入:[0,2,1,-6,6,7,9,-1,2,0,1]
输出:false
示例 3:
输入:[3,3,6,5,-2,2,5,1,-9,4]
输出:true
解决思路:
这道题目的解决思路很简单,我们要将一个数组平分成三个和相当的数组。首先我们先算出整体数组的和能否被3整除,如果不能,说明肯定不能平分成和相等的三个数组,直接返回false;如果和能被3整除,那接下来我们要看数组中的元素值是否能分成三个和相等的数组。遍历数组,不断累加求和,当和等于平分值时,就找出了第一个平分节点;然后用同样的方法求出第二个平分节点。如果两个平分节点值都符合平分成三个数组的条件,则返回true。
代码实现:
/**
* 将数组分成和相等的三个部分
* https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/
* @param A
* @author Geyuxuan 2020-03-11 23:17:10
* @return boolean
*/
public boolean canThreePartsEqualSum(int[] A) {
//计算出数组所有元素的和,判断是否能被3整除
int sum = 0;
for(int i = 0; i < A.length; i++) {
sum += A[i];
}
//如果能被3整除,则判断数组能否按顺序分成三份
if(sum % 3 == 0){
//计算平均值
int avg = sum / 3;
//每个平分数组的和
int sum1 = 0;
//第一个平分节点
int x1 = -1;
//第二个平分节点
int x2 = -1;
//遍历找出第一个平分节点
for(int i = 0; i < A.length - 2; i++) {
//平均分组的和
sum1 += A[i];
//如果相等,说明找到第一个平分点
//记录当前点,清空平分数组的和,跳出循环
if(sum1 == avg){
x1 = i;
sum1 = 0;
break;
}
}
//第一个节点大于零,并且小于数组长度减二
//节点初始值为-1,小于零说明第一个平分节点不存在
//第一个平分节点必须小于数组长度减二,因为后面两个平分数组至少要两个元素,反之则说明当前数组没有三个平分数组
if(x1 < 0 || x1 >= A.length-2){
return false;
}
//遍历找出第二个平分节点
for(int i = x1+1; i < A.length-1; i++) {
//平均分组的和
sum1 += A[i];
//如果相等,说明找到第一个平分点
//记录当前点,跳出循环
if(sum1 == avg){
x2 = i;
break;
}
}
//第二个平分节点必须小于数组长度减一,因为后面的平分数组至少要一个元素,反之则说明当前数组没有三个平分数组
if(x2 < A.length-1){
return true;
}
return false;
}else{
return false;
}
}
不忘初心,砥砺前行。
本文介绍力扣一道经典题目,如何判断一个整数数组能否被划分成三个和相等的部分。通过计算总和并检查是否能被3整除,再遍历数组寻找平分节点的方法,实现解决方案。
1万+

被折叠的 条评论
为什么被折叠?



