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 輸出...