LeetCode每日一题——927. 三等分

简介: 给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个非空的部分 ,使得所有这些部分表示相同的二进制值。

题目

给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个非空的部分 ,使得所有这些部分表示相同的二进制值。

如果可以做到,请返回任何 [i, j],其中 i+1 < j,这样一来:

arr[0], arr[1], …, arr[i] 为第一部分;

arr[i + 1], arr[i + 2], …, arr[j - 1] 为第二部分;

arr[j], arr[j + 1], …, arr[arr.length - 1] 为第三部分。

这三个部分所表示的二进制值相等。

如果无法做到,就返回 [-1, -1]。

注意,在考虑每个部分所表示的二进制时,应当将其看作一个整体。例如,[1,1,0] 表示十进制中的 6,而不会是 3。此外,前导零也是被允许的,所以 [0,1,1] 和 [1,1] 表示相同的值。

示例

示例 1:

输入:arr = [1,0,1,0,1]

输出:[0,3]

示例 2:

输入:arr = [1,1,0,1,1]

输出:[-1,-1]

示例 3:

输入:arr = [1,1,0,0,1]

输出:[0,2]

提示:

3 <= arr.length <= 3 * 104

arr[i] 是 0 或 1

思路

自己写的双重for循环暴力寻找分割方法很明显会超时,借鉴了官方的做法

1.首先统计1的个数,如果1的个数不是3的倍数,则不可能三等分,直接返回即可。如果1的个数为零,这时可以返回符合题意的答案[0,2]

2.每一部分都应该有(index = len(arr) // 3)个1,我们需要找到第一个1、第index+1个1、第2*index+1个1的下标。因为给定数组的长度是确定的,所以我们的第三个部分的长度是已经确定的,也就是(n = len(arr) - third)

3.分别比较从first、second、third开始的之后n位是否全部相等(在下标否符合条件的情况下,也就是first + l <= second and second + l <= third),如果全部相等可以返回答案[first+l-1, second+l],如果不相等或下标不符合条件,直接返回[-1,-1]

题解

class Solution:
    def threeEqualParts(self, arr: List[int]) -> List[int]:
        # 计算1的数量
        s = 0
        for i in range(len(arr)):
            if arr[i] == 1:
                s += 1
        # 1的数量不为3的倍数,直接返回
        if s % 3 != 0:
            return [-1,-1]
        # 没有1,直接返回
        if s == 0:
            return [0,2]
        index = s // 3
        # 寻找第一个、第index个、第2*index个1
        first, second, third, cur = 0,0,0,0
        for i,j in enumerate(arr):
            if j == 1:
                if cur == 0:
                    first = i
                if cur == index:
                    second = i
                if cur == 2 * index:
                    third = i
                cur += 1
        # 比较从first,second,third相对位置是否全部相同
        l = len(arr) - third
        # 下标需符合条件
        if first + l <= second and second + l <= third:
            n = 1
            while third + n <len(arr):
                # 不相等直接返回
                if arr[first + n] != arr[second + n] or arr[first + n] != arr[third + n]:
                    return [-1,-1]
                n += 1
            # 最后全部相等返回
            return [first+l-1, second+l]
        return [-1,-1]
目录
相关文章
Leetcode-每日一题927. 三等分(双指针)
题目需要你帮他把这个arr序列分成连续的三段序列,序列是由0、1组成,每段的0、1序列组成的二进制数都要相等。你只需要找到第一段序列与第二段序列的分割点 i, 第二段序列与第三段序列的分割点j。
166 0
Leetcode-每日一题927. 三等分(双指针)
|
人工智能 算法 C++
每日算法系列【LeetCode 927】三等分
每日算法系列【LeetCode 927】三等分
117 0
|
算法
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
241 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
164 6
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
174 4
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
350 2
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
245 3
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
324 1
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
325 7

热门文章

最新文章