本文主要是介绍1013. Partition Array Into Three Parts With Equal Sum,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1013. 将数组分成和相等的三个部分
给定一个整数数组
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 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4
提示:
3 <= A.length <= 50000
-10000 <= A[i] <= 10000
解法一
//时间复杂度O(n), 空间复杂度O(n)
class Solution {
public:bool canThreePartsEqualSum(vector<int>& A) {int n = A.size();vector<int> vec(n);vec[0] = A[0];for(int i = 1; i < n; i++) {vec[i] += vec[i - 1] + A[i];//前i项累积和}if(vec[n - 1] % 3 != 0) return false;int i = 0, pts = vec[n - 1] / 3;//部分和while(i < n && vec[i] != pts) i++;if(i == n) return false;while(i < n && vec[i] != 2 * pts) i++;return i < n - 1;}
};
解法二
//时间复杂度O(n), 空间复杂度O(1)
class Solution {
public:bool canThreePartsEqualSum(vector<int>& A) {int average = 0, psum = 0, count = 0;for(int num : A) average += num;if(average % 3 != 0) return false;average /= 3;for(int num : A) {psum += num;if(psum == average) {count++;psum = 0;} }return count == 3;}
};
解法一:
对数组的第i项,记录其前i项的累积和vec[i]。
- 如果其总和vec[n - 1]不是3的倍数,则一定不能分成相等的三份,直接返回false;
- 如果是3的倍数,其应该有3个子数组,部分和为pts = vec[n-1]/3。遍历累积和,找出其中是否同时存在pts和2 * pts。若有则返回true,否则为false。
解法二:
思路类似,对解法一的空间效率加以优化。
这篇关于1013. Partition Array Into Three Parts With Equal Sum的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!