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