leetcode 927.threeEqualParts 三等分

xiaoxiao2025-09-18  59

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 nsall(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 ,提交通过

转载请注明原文地址: https://www.6miu.com/read-5036533.html

最新回复(0)