刷题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

重难点

  1. 求数组A的元素和sum。
  2. 遍历数组A的元素,判断元素之和有几个sum/3。
  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 && 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;
}

  

 

猜你喜欢

转载自www.cnblogs.com/liu-xin1995/p/12464067.html
今日推荐