刷题40(力扣1道题+牛客1道题)

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。

题目分析

  1. 求数组A的元素和sum;
  2. 如果sum可以被3整除,那么遍历数组A的元素,判断元素之和res是否等于sum/3,若等于,则num加1,res=0;
  3. 统计num的个数,若sum != 0,那么sum/3不为0,此时num等于3才可以把数组分成3等分;若 sum等于 0,那么num>2,数组都可以分成3等分,即:当sum != 0 && num==3,或者 sum == 0 && num > 2返回true;
  4. 其余返回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)

题目分析

  1. 设置变量max存放最大值,并赋初值为array[0];
  2. 遍历数组,求和sum,若当前求和小于当前元素,令sum等于当前元素;
  3. 比较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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值