927. 三等分 // go語(yǔ)言實(shí)現(xiàn)

題目

給定一個(gè)由 0 和 1 組成的數(shù)組 A,將數(shù)組分成 3 個(gè)非空的部分,使得所有這些部分表示相同的二進(jìn)制值。

如果可以做到,請(qǐng)返回任何 [i, j],其中 i+1 < j,這樣一來(lái):

A[0], A[1], ..., A[i] 組成第一部分;
A[i+1], A[i+2], ..., A[j-1] 作為第二部分;
A[j], A[j+1], ..., A[A.length - 1] 是第三部分。
這三個(gè)部分所表示的二進(jìn)制值相等。
如果無(wú)法做到,就返回 [-1, -1]。

注意,在考慮每個(gè)部分所表示的二進(jìn)制時(shí),應(yīng)當(dāng)將其看作一個(gè)整體。例如,[1,1,0] 表示十進(jìn)制中的 6,而不會(huì)是 3。此外,前導(dǎo)零也是被允許的,所以 [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


思路

有幾個(gè)不太容易一眼就發(fā)現(xiàn)的小tips

  • 分為三等份的相同值,其 ‘1’ 的個(gè)數(shù)應(yīng)該是相同的,也就是說(shuō),在給定的數(shù)組中,’1‘ 的個(gè)數(shù)應(yīng)該可以 % 3 == 0,否則無(wú)法分為三等份??梢苑譃槿确莸拿恳环葜小?‘的個(gè)數(shù)應(yīng)該是數(shù)組中’1‘的個(gè)數(shù)除三。
  • 知道‘1’的個(gè)數(shù)以后,我們可以確定下來(lái)每一份的值,該值是唯一的,可以通過(guò)最后一份來(lái)求出:從后往前遍歷數(shù)組,直到‘1’的個(gè)數(shù)等于數(shù)組中‘1’的個(gè)數(shù)除三,該二進(jìn)制數(shù)就是每一份的值。(該過(guò)程可以保留后綴的‘0’的數(shù)量以備后面用到)
  • 確定值后,可以從前向后遍歷數(shù)組,同樣通過(guò)‘1’的個(gè)數(shù)找數(shù),‘1’的個(gè)數(shù)找齊后,加上剛才求出后綴0,如果后面的0的數(shù)量沒(méi)有求出的后綴0多,則無(wú)法分割。若有,求這個(gè)二進(jìn)制數(shù)的值,等于之前求出的值,則這個(gè)位置就是i 的值,若不像等,則無(wú)法分割。重復(fù)該步驟可以得到j(luò) 的值。

該方法的時(shí)間復(fù)雜度為O(n),如果大家有更優(yōu)秀的解決辦法,或者可以?xún)?yōu)化的地方,歡迎留言。

code

func threeEqualParts(A []int) []int {
    var lA = len(A) -1
    result := make([]int,0,2)
    ones := 0
    for _, a := range A {
        if a == 1 {
            ones++
        }
    }
    if ones % 3 != 0{
        result = append(result, -1, -1)
        return result
    }
    
    partOnes := ones / 3
    if partOnes == 0 {
        result = append(result, 0, 4)
        return result
    }
    tPartOnes := partOnes
    suffixZero := 0
    flag := false
    realValue := 0
    var tmpI, tmpJ int
    
    for i:=lA;i>0;i-- {
        // 確定真值 suffixZero
        if !flag && A[i] == 0{
            suffixZero++
        }
        if A[i] == 1 {
            flag = true
            tPartOnes--
            if tPartOnes == 0{
                realValue = cal(A[i:])
                tmpJ = i
                break
            }
        }   
    }
    
    
    tmpI,ok := find(A[:tmpJ], partOnes, realValue, suffixZero)
    if ! ok {
        result = append(result, -1, -1)
        return result
    }
    tmpJ, ok = find(A[tmpI+1:tmpJ], partOnes, realValue, suffixZero)
    if ! ok {
        result = append(result, -1, -1)
        return result
    }
    tmpJ = tmpI+tmpJ+2
    
    result = append(result, tmpI, tmpJ)
    return result
    
}

// 用來(lái)找 1、2 部分,從前找,找到就返回當(dāng)前位置
func find(A []int, partOnes, realValue, suffixZero int) (i int, b bool) {
    l := len(A) -1
    tmpI:=0
    for i, a := range A {
        if a == 1 {
            partOnes--
            if partOnes==0{
                for j:=suffixZero;j>0;j--{
                    if i+j > l {
                        return 0, false
                    }
                    if A[i+j] != 0{
                        return 0, false
                    }
                }
                tmpI = i+suffixZero
                break
            }
        }
    }
    
    if cal(A[:tmpI+1]) != realValue {
        return 0, false
    }
    return tmpI, true
}

func cal(A []int) int {
    l := len(A)
    result := 0
    for i, a := range A {
        result += a * ((l-i) * (l-i))
    }
    return result
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類(lèi)型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 4,061評(píng)論 0 2
  • 計(jì)算機(jī)二級(jí)C語(yǔ)言上機(jī)題庫(kù)(南開(kāi)版) 1.m個(gè)人的成績(jī)存放在score數(shù)組中,請(qǐng)編寫(xiě)函數(shù)fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,621評(píng)論 1 42
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,569評(píng)論 0 13
  • 一、目標(biāo)客戶(hù)群體 1、客戶(hù)描述 已婚男女,高端人士, 2、客戶(hù)來(lái)源 農(nóng)爸爸客戶(hù),有機(jī)同行,培訓(xùn)班學(xué)員(思八達(dá)、老子...
    農(nóng)爸爸閱讀 201評(píng)論 0 0
  • 已經(jīng)深刻掌握的知識(shí)點(diǎn)如下 知識(shí)點(diǎn)A:display:flex和inline-flex的區(qū)別: flex的作用對(duì)象是...
    kayleeWei閱讀 170評(píng)論 0 0

友情鏈接更多精彩內(nèi)容