leetcode 395 雙指標X 分治

2021-10-20 12:03:52 字數 958 閱讀 7330

這題一看太像雙指標了,熟悉的子區間問題,但這次不太一樣。熟悉的雙指標模板這裡是不適用的。所以本題應該用分治做。關鍵的點在於,如果在字串裡有乙個字元,他總數小於k,那麼,任何包含這個字元的子串都不滿足條件。所以,咱們應該把這個字元剔除出去,這個是核心。**如下:

class

solution

:def

longestsubstring

(self, s:

str, k:

int)

->

int:

c0 = counter(s)

iflen

(s)==0:

return

0if c0.most_common(

len(c0))[

-1][

1]>= k:

return

len(s)

for c in c0:

if c0[c]

< k:

return

max(

[self.longestsubstring(i, k)

for i in s.split(c)

])

此題不能用雙指標的主要原因是,正常的雙指標只需要維護乙個狀態,比如區間內相同字元個數,不同字元個數等,咱們可以不夠就擴充,夠了就停。一般往右走的夠久,條件就會滿足。但這個題,指標就算一直走,也不一定能滿足條件。所以肯定是用不了雙指標的。

雙指標核心是二分:當右指標落位時,左指標可以滿足二段性質,左邊不滿足,右邊滿足。

上題是可以的。具體有一些貪心的思想需要證明,但區域性顯而易見是正確的。

但是本題明顯不行,當你右邊加了乙個未出現的元素時,就不可能滿足了,右邊怎麼走都沒用。特別是視窗為0時,那是寸步難行,根本沒法往右走。

Leetcode 題解 雙指標

雙指標 有序陣列 字串翻轉 環形鍊錶問題 雙指標主要用於遍歷陣列,兩個指標指向不同的元素,從而協同完成任務。有序陣列的 two sum1 leetcode 167.two sum ii input array is sorted easy input numbers target 9 output ...

leetcode 雙指標專題

題目 4.尋找兩個有序陣列的中位數 解析 通過2個下標來依次比較2個陣列的元素,直到走過的數量達到一半,複雜度 m n 2 答案 double findmediansortedarrays int nums1,int nums1size,int nums2,int nums2size else co...

leetcode雙指標總結

雙指標一般又分為3中應用 判斷鍊錶是否有環 一快一慢 f和 s 相遇的話就是 成環 沒有相遇就是沒成環 判斷鍊錶中環的起點 鍊錶中證明了 f指標一定比慢指標多走n圈環的長度 f s nb f 2 s 可以得到 s nb 這個時候 如果再走鍊錶起點到環起點的a步的話 也就是 環的起點 所以我們用f指標...