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. 连续子数组的最大和
题目链接
题目描述
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; }