leetcode 927.threeEqualParts 三等分

17 篇文章 0 订阅
14 篇文章 0 订阅

leetcode 927.threeEqualParts

class Solution:
    def threeEqualParts(self, A):
        """
        :type A: List[int]
        :rtype: List[int]
        """
        A = [str(a) for a in A]
        for i in range(0, len(A) - 2):            
            for j in range(i + 2, len(A)):                
                if int(str(A[0]) + ''.join(A[1:i+1]), 2) == int(''.join(A[i + 1:j]), 2) == int(''.join(A[j:]), 2):
                    return [i, j]
        else:
            return [-1, -1]
a = Solution()
l=[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,0,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,0,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,0,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0]

timeit

301 ms ± 3.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

提交以后超时

测试

  • any(l): 171 ns ± 0.689 ns
  • all(l): 95.5 ns ± 8.28 ns
    优化代码
class Solution:
    def threeEqualParts(self, A):
        """
        :type A: List[int]
        :rtype: List[int]
        """
        if all([i == 0 for i in A]):
            return [0, 2]
        else:
            A = [str(a) for a in A]
            i = 0
            j = len(A) - 1
            while i + 1 < j:
                if int(str(A[0]) + ''.join(A[1:i + 1]), 2) > int(''.join(A[j:]), 2):
                    j -= 1
                elif int(str(A[0]) + ''.join(A[1:i + 1]), 2) < int(''.join(A[j:]), 2):
                    i += 1
                elif int(str(A[0]) + ''.join(A[1:i + 1]), 2) == int(''.join(A[j:]), 2):
                    if int(str(A[0]) + ''.join(A[1:i + 1]), 2) == int(''.join(A[i + 1:j]), 2):
                        return [i, j]
                    else:
                        j -= 1
            else:
                return [-1, -1]

速度有所提高:1.88 ms ± 68.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

提交仍然超时

看答案:

class Solution:
    def threeEqualParts(self, A):
        """
        :type A: List[int]
        :rtype: List[int]
        """
        # 如果全零返回[0, 2]
        if all([i == 0 for i in A]):
            return [0, 2]
        
        # 要满足条件,列表中1的数量必然可以被3整除,t是分成3段每段中1的个数
        if sum(A) % 3 != 0:
            return [-1, -1]
        else:
            t = sum(A) / 3
        
        # 列表切分成3段,m1-m6是每段的第一个1和最后一个1的位置,分两步追加是因为m1与m4、m2与m5、m3与m6可能重合
        interval = []
        flag = 0
        for i, n in enumerate(A):
            if n:
                flag += 1
                if flag in (1, t + 1, 2 * t + 1):
                    interval.append(i)
                if flag in (t, 2 * t, 3 * t):
                    interval.append(i)
        m1, m2, m3, m4, m5, m6 = interval
        
        # 要想3段等分,首先要满足3段中首尾是1的部分完全相同
        if A[m1: m2 + 1] == A[m3: m4 + 1] == A[m5: m6 + 1]:
            # 然后第一段和第二段的最后一个1后面的0的个数要大于等于最后一段最后一个1后面的0的个数
            zero_after_m6 = len(A) - (m6 + 1)
            if len(A[m2+1:m3]) >= zero_after_m6 and len(A[m4+1:m5]) >= zero_after_m6:
                return [m2 + zero_after_m6, m4 + zero_after_m6 + 1]
            else:
                return [-1, -1]
        else:
            return [-1, -1]

本地测试216 µs ± 31.5 ,提交通过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值