72.将数组分成和相等的三个部分
题目链接
来源:力扣(LeetCode)
链接: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 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4
提示:
3 <= A.length <= 50000
-10^4 <= A[i] <= 10^4
重难点
求数组A的元素和sum。
遍历数组A的元素,判断元素之和有几个sum/3。
若sum != 0且num==3,或者 sum == 0且num > 2返回true。
题目分析
- 求数组A的元素和sum;
- 如果sum可以被3整除,那么遍历数组A的元素,判断元素之和res是否等于sum/3,若等于,则num加1,res=0;
- 统计num的个数,若sum != 0,那么sum/3不为0,此时num等于3才可以把数组分成3等分;若 sum等于 0,那么num>2,数组都可以分成3等分,即:当sum != 0 && num==3,或者 sum == 0 && num > 2返回true;
- 其余返回false。
/**
* @param {number[]} A
* @return {boolean}
*/
var canThreePartsEqualSum = function(A) {
let sum = 0;
for(let i=0;i<A.length;i++){
sum += A[i];
}
if(sum % 3 == 0){
let res = 0;
let num = 0;
for(let j=0;j<A.length;j++){
res += A[j];
if(res == sum/3){
res = 0;
num++;
}
}
if((sum != 0 && num == 3) || (sum == 0 && num > 2)){
return true;
}else {
return false;
}
}else {
return false;
}
};
可把返回语句简写:
/**
* @param {number[]} A
* @return {boolean}
*/
var canThreePartsEqualSum = function(A) {
let sum = 0;
for(let i=0;i<A.length;i++){
sum += A[i];
}
let res = 0;
let num = 0;
for(let j=0;j<A.length;j++){
res += A[j];
if(res == sum/3){
res = 0;
num++;
}
}
return (sum != 0 && num == 3) || (sum == 0 && num > 2);
};
73. 连续子数组的最大和
题目链接
https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&&tqId=11183&rp=26&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking
题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
题目分析
- 设置变量max存放最大值,并赋初值为array[0];
- 遍历数组,求和sum,若当前求和小于当前元素,令sum等于当前元素;
- 比较sum和max的大小,若sum>max,max=sum。
function FindGreatestSumOfSubArray(array)
{
let sum = 0;
let max = array[0];
for(let i=0;i<array.length;i++){
sum += array[i];
if(sum < array[i]){
sum = array[i];
}
if(sum > max){
max = sum;
}
}
return max;
}