雙指標到滑動視窗

2021-09-29 12:28:03 字數 2136 閱讀 3856

1、判定鍊錶中是否含有環

解析:定義兩個指標,一快一慢。如果有環,則會相遇。

boolean

hascycle

(listnode head)

return

false

;}

2、已知鍊錶中含有環,返回這個環的起始位置

解析: 快指標走了2k步,慢指標走了k步。多的k步就是環的長度。假設相遇點距離環起始位置m步,則環入口距離初始位置k-m步,相遇點再走k-m步也能到環入口。所以慢指標指向head,快指標指向相遇點,同時前進就能到環的起始位置。

listnode deletecycle

(listnode head)

slow=head;

while

(slow != fast)

return slow;

}

3兩數之和。

例子:

n=[2

,7,11

,5],target =

9輸出:[1

,2]

解析:

int

twosum

(int nums,

int target);}

else

if(target>sum)

else

if(target < sum)

}return

newint

;}

4反轉陣列

例子:

void

reverse

(int

nums)

}

5無重複字元的最長子串

例子:

輸入:

"abcabcbb"

輸出:3

解析:start先不動,用end去搜尋,搜尋到已經存在的字元則讓start指向前面重複字元的下一位。每一輪更新ans,取最大

class

solution

ans = math.

max(ans, end - start +1)

;//最大視窗

map.

put(s.

charat

(end)

, end +1)

;}return ans;

}}

最小覆蓋子串

例子:

輸入: s =

"adobecodebanc"

, t =

"abc"

輸出:"banc"

解析:

public string minwindow

(string s, string t)

int left =0;

//左指標

int right =0;

//右指標

int ans_left =0;

//儲存最小視窗的左邊界

int ans_right =-1

;//儲存最小視窗的右邊界

int ans_len = integer.max_value;

//當前最小視窗的長度

//遍歷字串 s

while

(right < s.

length()

)//得到左指標的字母

char key = s.

charat

(left)

;//判斷 map 中是否有當前字母

if(map.

containskey

(key)

) left++

;//左指標右移}}

//右指標右移擴大視窗

right++;}

return s.

substring

(ans_left, ans_right+1)

;}//判斷所有的 value 是否為 0

private

boolean

match

(map

map)

}return

true

;}

雙指標之滑動視窗總結

這個星期做的都是有關雙指標和滑動視窗的有關leecode題。同樣有點小感悟,這裡小小總結一下雙指標中的滑動視窗部分。對於給定字串求其某個符合一定條件的子串的問題,最簡單的方法就是暴力的兩層迴圈,它的時間複雜度至少是o n2 一般條件下,這樣的複雜的往往都會因為超時而 over 相對來說,如果能對暴力...

雙指標問題和滑動視窗問題

好幾天沒寫啦,不過這段時間一直都在做題,沒有一天拉下,這幾天寫了不少雙指標問題,動態規劃問題也在慢慢地熟練了,看資料,找規律,找前一 秒 的狀態,找出狀態轉換方程。到雙指標問題,我真是2分鐘就把問題怎麼解決想了出來,但是有一道題實現時候,總是答案不對,我也不知道為什麼,後來才發現,我只是大致的把指標...

雙指標遍歷 滑動視窗 42 接雨水

6.42 接雨水 上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 暴力解,o n o 1 class solution for int j i j size j ans math.min leftmax,right...