• 【LeetCode】1013. 将数组分成和相等的三个部分


    题目链接:

    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
    

    思路:

    若数组和 sum 不是 3 的倍数,直接 false

    设置头尾两个指针 leftright,这样两个指针就将数组分为了三部分。

    1. 两个指针向中间移动,同时求数组第 1 段(left 左边)、第 3 段(right 右边)的和。
    2. 若发现这两段的和都等于 sum / 3 ,则可以分为三部分,返回 true
    3. 若两指针碰头时仍然不能满足 2,则不能分成三部分,返回 false

    代码实现:

    class Solution {
        public boolean canThreePartsEqualSum(int[] A) {
            int sum = 0;
            for (int i: A) {
                sum += i;
            }
            // 数组和不是3的倍数,直接false
            if (sum % 3 != 0) {
                return false;
            }
    
            // 左右指针
            int left = 0, right = A.length - 1;
            // 第1段的和,第3段的和
            int leftSum = A[left], rightSum = A[right];
            
            while (left + 1 < right) {
                if ((leftSum == sum / 3) && (rightSum == sum / 3)) {
                    return true;
                }
                if (leftSum != sum / 3) {
                    left ++;
                    leftSum += A[left];
                }
                if (rightSum != sum / 3) {
                    right --;
                    rightSum += A[right];
                }
            }
            return false;
        }
    }
    

    代码中几个注意点:

    1. while 循环条件 left + 1 < right,这是为了保证将数组分为三段。
    2. leftSumrightSum 的初始值,应当设置为 leftSum = A[left], rightSum = A[right];,而不应当设置为 leftSum = 0, rightSum = 0;。如果设置为 0,对数组 [1, -1, 1, -1] 判断将会出错。
  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/ME-WE/p/12461115.html
Copyright © 2020-2023  润新知