Leetcode 題解 雙指標

2021-09-22 16:40:13 字數 4660 閱讀 6100

雙指標: 有序陣列  字串翻轉  環形鍊錶問題

雙指標主要用於遍歷陣列,兩個指標指向不同的元素,從而協同完成任務。

有序陣列的 two sum1

leetcode :167. two sum ii - input array is sorted (easy)

input: numbers=, target=9

output: index1=1, index2=2

題目描述:在有序陣列中找出兩個數,使它們的和為 target。

使用雙指標,乙個指標指向值較小的元素,乙個指標指向值較大的元素。指向較小元素的指標從頭向尾遍歷,指向較大元素的指標從尾向頭遍歷。

public

int twosum(

int numbers,

inttarget) ; }

else

if(sum

<

target)

else }

return

null;

} 2  633. sum of square numbers (easy)

input: 5

output: true

explanation: 1 * 1 + 2 * 2 = 5

題目描述:判斷乙個數是否為兩個數的平方和。

public

boolean

judgesquaresum(

intc)

else

if(powsum

>

c)

else }

return

false;

}反轉字串中的母音字元

3  345. reverse vowels of a string (easy)

given s = "leetcode", return "leotcede".

使用雙指標指向待反轉的兩個母音字元,乙個指標從頭向尾遍歷,乙個指標從尾到頭遍歷。

private

final

static

hashset<

character

>

vowels

=new

hashset<>

(arrays

.aslist(

'a',

'e',

'i',

'o',

'u',

'a',

'e',

'i',

'o',

'u')); h

ashset的應用 arrays.aslist

public

string reversevowels(string s)

elseif(

!vowels

.contains(cj))

else }

return

newstring(result);

string函式的用法引數可以放到result }

if,  else if,  else 這些邏輯搞清楚 一次只能完成一部 否則會因為

4  680. valid palindrome ii (easy)

input: "abca"

output: true

explanation: you could delete the character 'c'.

題目描述:可以刪除乙個字元,判斷是否能構成回文字串。

public

boolean

validpalindrome(string s) }

return

true;

} private

boolean

ispalindrome(string s,

inti,

intj) }

return

true;

} 5  88. merge sorted array (easy)

input:

nums1 = [1,2,3,0,0,0], m = 3

nums2 = [2,5,6],       n = 3

output: [1,2,2,3,5,6]

題目描述:把歸併結果存到第乙個陣列上。

需要從尾開始遍歷,否則在 nums1 上歸併得到的值會覆蓋還未進行歸併比較的值。

本方法是下乙個方法的改進

其實在nums1中留出足夠空位之後,按雙指標在任意乙個陣列中的排列是不會對資料產生影響的因為大的值已經被安排在後面的空位上,指標後面的值即使被占用也是按順序排位之後的

class solution }

}class solution

for(int i=0; i < merge; i++) }

}判斷鍊錶是否存在環

6  141. linked list cycle (easy)

given a linked list, determine if it has a cycle in it.

to represent a cycle in the given linked list, we use an integer 

poswhich represents the position (0-indexed) in the linked list where tail connects to. if 

posis 

-1, then there is no cycle in the linked list.

example 1:

input:

head = [3,2,0,-4], pos = 1output:

trueexplanation:

there is a cycle in the linked list, where tail connects to the second node.

example 2:

input:

head = [1,2], pos = 0output:

trueexplanation:

there is a cycle in the linked list, where tail connects to the first node.

example 3:

input:

head = [1], pos = -1output:

falseexplanation:

there is no cycle in the linked list.

使用雙指標,乙個指標每次移動乙個節點,乙個指標每次移動兩個節點,如果存在環,那麼這兩個指標一定會相遇。

public

boolean

hascycle(listnode head)

listnode l1

=head, l2

=head

.next;

while

(l2

!=null

&&l2

.next

!=null)

l1 =l1.

next;

l2 =l2

.next

.next; }

return

false;

} /**

* definition for singly-linked list.

* class listnode

* } */

public class solution

return false; }

}最長子序列

記住字典順序的比較就可以了

input:

output:

題目描述:刪除 s 中的一些字元,使得它構成字串列表 d 中的乙個字串,找出能構成的最長字串。如果有多個相同長度的結果,返回字典序的最小字串。

public

string findlongestword(string s,

list<

string

>

d)

if(isvalid(s, target)) }

return

longestword; }

第二部分

判斷s能否成為target字串 雙指標

private

boolean

isvalid(string s, string target) i

++; }

return

j ==

target

.length(); }

leetcode題解 雙指標問題

雙指標問題總結 移除元素 給你乙個陣列 nums 和乙個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度。不要使用額外的陣列空間,你必須僅使用 o 1 額外空間並 原地 修改輸入陣列。元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。示例 1 給定 nu...

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