927. 三等分
給定一個由 0 和 1 組成的數組 A,将數組分成 3 個非空的部分,使得所有這些部分表示相同的二進制值。
如果可以做到,請傳回任何 [i, j],其中 i+1 < j,這樣一來:
A[0], A[1], …, A[i] 組成第一部分;
A[i+1], A[i+2], …, A[j-1] 作為第二部分;
A[j], A[j+1], …, A[A.length - 1] 是第三部分。
這三個部分所表示的二進制值相等。
如果無法做到,就傳回 [-1, -1]。
注意,在考慮每個部分所表示的二進制時,應當将其看作一個整體。例如,[1,1,0] 表示十進制中的 6,而不會是 3。此外,前導零也是被允許的,是以 [0,1,1] 和 [1,1] 表示相同的值。
示例 1:
輸入:[1,0,1,0,1]
輸出:[0,3]
示例 2:
輸出:[1,1,0,1,1]
輸出:[-1,-1]
提示:
3 <= A.length <= 30000
A[i] == 0 或 A[i] == 1
逾時的心累=-=
簡單說下過程:
- 首先判斷清單中1的個數,如果不是三的倍數,傳回假
- 對1的個數除以3,得到的數值将是每一組所含有的1的個數cnt
- 計算A的長度,友善之後的傳回索引
- 從左向右計算cnt個1在那一個位置,從右往左也計算cnt個1在哪個位置,分别命名為 j , i
- 對s1,s2,s3進行初步的判斷,如果有相等,可以直接指派out
- 接下來就是右移s1的右指針,左移s2的左指針。
- 最後輸出out
class Solution:
def threeEqualParts(self, A: List[int]) -> List[int]:
num = sum(A)
if num % 3 != 0: return[-1,-1]
if num == 0: return [0,len(A)-1]
n = len(A)
A = [str(i) for i in A]
#從左向右計算cnt個1在哪個索引
cnt = num // 3
i = n
while cnt and i > 0:
if A[i-1] == '1':
cnt -= 1
i -= 1
#從右往左計算cnt個1在哪個索引
cnt = num // 3
j = 0
while cnt and j < n:
if A[j] == '1':
cnt -= 1
j += 1
#初始化輸出,三個清單的數值,去除左0
out = [-1,-1]
s1 = ''.join(A[:j]).lstrip('0')
s2 = ''.join(A[j:i]).lstrip('0')
s3 = ''.join(A[i:]).lstrip('0')
#對三個清單值進行初步的判斷,減少之後的運算
if s1 == s2 == s3: return [j-1, i]
if s1 == s3: out[0] = j-1
if s2 == s3: out[1] = i
#s1的指針右移,如果不是1,則加入s1,s1 == s3,或者右指針為1結束。如果找到s1 ==s3,直接傳回
while A[j] != '1' and s1 < s3:
s1 += ('0')
if s1 == s3:
out[0] = j
break
j += 1
#s2的右指針左移,如果不是1,則s2減去末尾的值,同理
while A[i-1] != '1' and s2 > s3:
s2 = s2[:-1]
if s2 == s3:
out[1] = i-1
break
i -= 1
#如果out中還有坐标為-1,說明某兩個不相等
if -1 in out:
return [-1,-1]
else:
return out