leetcode -- 1013

1013. Partition Array Into Three Parts With Equal Sum

Problem Description

Given an array A of integers, return true if and only if we can partition the array into three non-empty parts with equal sums.

Formally, we can partition the array if we can find indexes i+1 < j with (A[0] + A[1] + … + A[i] == A[i+1] + A[i+2] + … + A[j-1] == A[j] + A[j-1] + … + A[A.length - 1])
在這裏插入圖片描述

Solution Method

Solution One

首先考慮的是首尾指針,但是發現條件不好判斷。於是改爲先求前綴和,之後再兩層for求任意兩個區間元素和,判斷是否有三個相等區間。在50/55時超時了。代碼如下:

bool canThreePartsEqualSum(int* A, int ASize)
{
    int prefixSum[ASize];
    memset (prefixSum, 0, sizeof(int) * ASize);
    prefixSum[0] = A[0];
    for (int i = 1; i < ASize; i ++)
    {
        prefixSum[i] = A[i] + prefixSum[i-1];
    }
    if (prefixSum[ASize-1] % 3 != 0)
        return false;
    for (int i = 0; i < ASize; i ++)
    {
        for (int j = 1;  j < ASize-1; j ++)
        {
            if (prefixSum[i] == (prefixSum[j] - prefixSum[i]) && prefixSum[i] == (prefixSum[ASize-1]-prefixSum[j]) && i < j)
            {
                return true;
            }
        }
    }
    return false;
}

Solution Two

利用sum的值,可將時間複雜度改爲O(n)。代碼如下:


bool canThreePartsEqualSum(int* A, int ASize)
{
    int sum = 0;
    int prefixSum[ASize], subI = -1, subJ = -1;
    memset(prefixSum, 0, sizeof(int) * ASize);
    for (int i = 0; i < ASize; i ++)
    {
        sum += A[i];
    }
    if (sum % 3 != 0)
        return false;
    prefixSum[0] = A[0];
    if (prefixSum[0] == sum/3)
        subI = 0;
    for (int i = 1; i < ASize-1;  i ++)
    {
        prefixSum[i] = prefixSum[i-1] + A[i];
        if (prefixSum[i] == sum/3 && subI == -1)
            subI = i;
        else if (prefixSum[i] == 2*(sum/3) && subI != i && subI != -1)
        {
            subJ = i;
            return true;
        }
    }
    return false;
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章