leetcode刷題 演算法思想

2021-10-03 02:41:01 字數 3252 閱讀 4309

[167] 兩數之和 ii - 輸入有序陣列

input: numbers =

, target =

9output: index1 =

1, index2 =

2

我的弱智解法:全部遍歷一遍

class

solution}}

return array;

}}

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

陣列中的元素最多遍歷一次,時間複雜度為 o(n)。只使用了兩個額外變數,空間複雜度為 o(1)。

public

int[

]twosum

(int

numbers,

int target);}

else

if(sum < target)

else

}return null;

}

[633]平方數之和

input:

5output: true

comment:1*

1+2*

2=5

解題思路和上道題類似,為了降低時間複雜度,使用到了sqrt

public

boolean

judgesquaresum

(int target)

else

if(powsum > target)

else

}return

false

;}

[345]反轉字串中的母音字母

input:

"leetcode"

output:

"leotcede"

解題思路:使用雙指標,乙個指標從頭向尾遍歷,乙個指標從尾到頭遍歷,當兩個指標都遍歷到母音字元時,交換這兩個母音字元。

class

solution

elseif(

!vowels.

contains

(cj)

)else

}return

newstring

(result);}

}

[680] 驗證回文字串 ⅱ

input:

"abca"

output: true

comment: you could delete the character 'c'

.

解題思路:在判斷是否為回文字串時,我們不需要判斷整個字串,因為左指標左邊和右指標右邊的字元之前已經判斷過具有對稱性質,所以只需要判斷中間的子字串即可。

在試著刪除字元時,我們既可以刪除左指標指向的字元,也可以刪除右指標指向的字元。

public

boolean

validpalindrome

(string s)

}return

true;}

private

boolean

ispalindrome

(string s,

int i,

int j)

}return

true

;}

[88] 合併兩個有序陣列

input:

nums1 =[1

,2,3

,0,0

,0], m =

3nums2 =[2

,5,6

], n =

3output:[1

,2,2

,3,5

,6]

解題思路:把歸併結果存到第乙個陣列上。需要從尾開始遍歷,否則在 nums1 上歸併得到的值會覆蓋還未進行歸併比較的值。

public

void

merge

(int

nums1,

int m,

int[

] nums2,

int n)

else

if(index2 <0)

else

if(nums1[index1]

> nums2[index2]

)else

}}

[141]環形鍊錶

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

/**

* definition for singly-linked list.

* class listnode

* }*/public

boolean

hascycle

(listnode head)

listnode l1 = head, l2 = head.next;

while

(l1 != null && l2 != null && l2.next != null)

l1 = l1.next;

l2 = l2.next.next;

}return

false

;}

[524]通過刪除字母匹配到字典裡最長單詞

input:	

s ="abpcplea"

, d =

["ale",,

"monkey"

,"plea"

]output:

解題思路:可以認為 target 是 s 的子串行,我們可以使用雙指標來判斷乙個字串是否為另乙個字串的子串行。

public string findlongestword

(string s, list

d)if

(issubstr

(s, target))}

return longestword;

}private

boolean

issubstr

(string s, string target)

i++;}

return j == target.

length()

;}

演算法 LeetCode刷題

given 1,3 2,6 8,10 15,18 return 1,6 8,10 15,18 關鍵就是a 1 b 0 也就是array i 1 1 array i 0 const merge array return array console.log merge 1,3 8,10 2,6 15,1...

演算法題 LeetCode刷題(五)

資料結構和演算法是程式設計路上永遠無法避開的兩個核心知識點,本系列 演算法題 旨在記錄刷題過程中的一些心得體會,將會挑出leetcode等最具代表性的題目進行解析,題解基本都來自於leetcode官網 本文是第五篇。給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以...

LeetCode刷題 演算法篇

暴力解法 class solution def twosum self,nums list int target int list int i 0 while i j i 1 while j if nums i nums j target return i,j j 1i 1 return none ...