31場雙周賽(補)

2022-09-16 14:18:14 字數 2516 閱讀 5514

9 }數學規律,送分題

通過奇-偶=奇,偶-奇=奇,統計所有奇數陣列30}

31return

res;32}

33 }

解題思路:對於該類,將陣列分為連續的陣列,求其和的題目,都可使用字首和來進行解答。該題也是如此,先利用字首和記錄陣列的所有字首和。由於題目要求尋找和為奇數的子陣列數目,如果我們繼續遍歷陣列,利用字首和相減的方式求出所有的子陣列之和,那麼這種暴力法將會超時,所以要進行優化。根據數學規律,不難發現,只有偶數-奇數,奇數-偶數時,才會得到奇數解,那麼我們可以利用這個規律,建立乙個新的dp陣列,來儲存[0,len - 1]的所有字首和的奇偶性。

那麼我們就只需要,尋找與當前奇偶性相反的字首和,就能匹配出新的和為奇數的子陣列,那麼如何尋找這些字首和呢?顯然,每次都再次遍歷陣列,那麼時間複雜度將會大大增加,依舊沒有達到優化的效果。那麼我們繼續優化,既然題目只需要尋找子陣列的個數,那麼我們是否可以建立乙個陣列,來儲存字首和奇數的個數,以及偶數的個數呢?當然是可以的,於是定義乙個陣列count[2],count[0]為偶數字首和的個數,count[1]為奇數字首和的個數,遍歷時只需要加上count[1 - dp[i]]就是當前的奇數陣列了。

注意點:

當計算字首和為奇數時,res需要進行+1操作,因為這也是乙個可能的子陣列。

進行字首和計算時,可以先計算arr[0]的情況,防止計算字首和時下標越界;當然也可以將sub陣列,dp陣列都定義成len + 1的長度。

時間複雜度:o(n),n為陣列長度

空間複雜度:o(n)

字元重複,數目不變19}

20 hashmapright = new hashmap(); //

儲存從右往左讀的字元

21 right.put(s.charat(len - 1), 1);

22for (int j = len - 2; j >= 0; j--)

27else dpright[j] = dpright[j + 1];28}

29for (int i = 0; i < len - 1; i++)

33return

res;34}

35 }

解題思路:根據題目要求,可以使用暴力法的方式解答,遍歷所有可能的分割情況,判斷其是否符合要求;當然,這種暴力法並不可取,時間複雜度太高。我們需對其進行優化,由於是將字串一分為二來進行字元數的統計,那麼關鍵就是在於這兩部分的字元數量如何快速的計算,我們先看左半部分,不難發現,我們只需遍歷一次陣列,就可以將左半部所有可能的情況計算出來,那麼對應的右半部如何計算呢?其實,右半部與左半部是等價的,如果我們將字串顛倒,那麼右半部就是新的左半部,就也同樣只需遍歷一次就可以求出所有的情況。所以對於右半部來說,我們只需從尾部出發,反向遍歷陣列就可以求出其所有情況了。最後只需找出對應的左右字元數是否相等即可。

注意點:

時間複雜度:o(n),n為字串長度

空間複雜度:o(n)

解題思路:

不是很好證明,有一點單調遞增棧的意味。簡單說明就是,只可以選擇子陣列進行-1操作,那麼這段連續數字的子陣列,都變為0,就取決於其最大值。

第 44 場雙周賽

easy 這個題目我沒有多想,跟著直覺走的,資料量比較小,那麼可以把一些關鍵資訊先暴力出來。然後直接遍歷統計,因為題目要求1種語言,這是突破口 這個題目我想了很久,一開始直接暴力,發現過不了 超時了,卡在第56個,資料量比較大的時候,超時了。然後仔細想想,這裡可以直接簡化運算,要計算的是中間會不會有...

leetcode第8場雙周賽

這次雙周賽有意外,第二第三題按照提示返回int會報錯,要返回list 第一題給你乙個字串 s,返回只含 單一字母 的子串個數。示例 1 輸入 aaaba 輸出 8 解釋 只含單一字母的子串分別是 aaa aa a b aaa 出現 1 次。aa 出現 2 次。a 出現 4 次。b 出現 1 次。所以...

leetcode第 24 場雙周賽

給你乙個整數陣列nums。你可以選定任意的正數startvalue 作為初始值。你需要從左到右遍歷nums陣列,並將 startvalue 依次累加上nums陣列中的值。請你在確保累加和始終大於等於 1 的前提下,選出乙個最小的正數作為 startvalue 輸入 nums 3,2,3,4,2 輸出...