Daily LeetCode – day0069 0927. Three Equal Parts

// 0927. Three Equal Parts
class Solution {
    public int[] threeEqualParts(int[] arr) {
        int sum = 0;
        for (int d : arr) sum += d;
        if (sum == 0) return new int[]{0, 2};
        int[] ans = new int[]{-1, -1};
        if (sum % 3 != 0) return ans;
        int oneThird = sum / 3;
        int first1Part3 = arr.length;
        int count1 = 0;
        while (count1 != oneThird) {
            --first1Part3;
            count1 += arr[first1Part3];
        }
        int lengthPart = arr.length - first1Part3;
        int first1Part1 = 0;
        while (arr[first1Part1] == 0) ++first1Part1;
        for (int i = 0; i < lengthPart; ++i) {
            if (arr[first1Part1 + i] != arr[first1Part3 + i]) return new int[]{-1, -1};
        }
        ans[0] = first1Part1 + lengthPart - 1;
        int first1Part2 = first1Part1 + lengthPart;
        while (arr[first1Part2] == 0) ++first1Part2;
        for (int i = 0; i < lengthPart; ++i) {
            if (arr[first1Part2 + i] != arr[first1Part3 + i]) return new int[]{-1, -1};
        }
        ans[1] = first1Part2 + lengthPart;
        return ans;
    }
}
学习笔记:
这是一道困难题,需要把数字变成三等分。
首先我们找到最后一段,因为最后一段可以保证后面的确定性,至于前导零就不考虑了。
然后根据最后一段的情况,来找第一段,先去掉前导零,然后试试看对不对得上。
如果第一段没问题,就再去掉前导零试试看找第二段。
全部都没问题就可以把两个下标找到返回了。


关于樊轶群

一个善良的理想主义者。
此条目发表在每日LeetCode分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注