劍指offer學習筆記

2021-10-21 20:07:38 字數 4482 閱讀 7395

筆記主要記錄方法和知識點

知識點1: 負數與補碼 乙個參考

知識點2: 移位操作(右移》,變小)、按位&操作

知識點3: 0xffffffff表示32位-1

o(logn)的方法:非遞迴的快速冪,用到二進位制表示。在迴圈內注意base *= base。

兩個指標等間距一起走。

想明白斷開鍊錶這個事情,相當於操作是在原有鍊錶上進行的。當然也可以把所有數存下來再重新建鍊錶。

回溯演算法,注意終止條件的設計

def

permutation

(self, ss)

:# write code here

ifnot ss:

return

res =

defbacktrack

(s, rest):if

not rest:

return

print

(rest)

for i in

range

(len

(rest)):

backtrack(s+rest[i]

, rest[

:i]+rest[i+1:

])backtrack(

'', ss)

return

sorted

(list

(set

(res)

))

較為基礎的動態規劃,考慮空間複雜度兩種做法:

def

findgreatestsumofsubarray

(self, array)

:# write code here

ifnot array:

return

none

''' dp = [i for i in array]

for i in range(1, len(array)):

dp[i] = max(dp[i-1] + array[i], array[i])

return max(dp)

'''max_sum = array[0]

max_temp = array[0]

for i in

range(1

,len

(array)):

if max_temp <0:

max_temp = array[i]

else

: max_temp += array[i]

max_sum =

max(max_sum, max_temp)

return max_sum

數學題,按位計算。注意!題目問的是1出現的次數,而不是帶1的數字出現的次數,後者更難。

leetcode上的解析

自定義比較,冒泡即可。

動態規劃,每次的新醜數都是由舊的乘出來的,關鍵在於選擇哪些舊醜數來乘。

for i in

range(1

, index)

: dp =

min(res[dp_2]*2

, res[dp_3]*3

, res[dp_5]*5

)if dp == res[dp_2]*2

: dp_2 +=

1if dp == res[dp_3]*3

: dp_3 +=

1if dp == res[dp_5]*5

: dp_5 +=

1

&, |, ^(異或)

無進製和(^)+進製(&,左移一位)

補碼:計算機中存整數n是用補碼存的。

請實現乙個函式用來匹配包括』.『和』*『的正規表示式。模式中的字元』.『表示任意乙個字元,而』*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"abaca"匹配,但是與"aa.a"和"ab*a"均不匹配。

動態規劃、遞迴

def

match

(self ,

str, pattern)

:# write code here

lens =

len(

str)

lenp =

len(pattern)

dp =[[

false]*

(lenp+1)

for _ in

range

(lens+1)

]

dp[0]

[0]=

true

for i in

range(1

, lens+1)

: dp[i][0

]=false

for j in

range(1

, lenp+1)

:if pattern[j-1]

=='*'

and j >=2:

dp[0]

[j]= dp[0]

[j-2

]else

: dp[0]

[j]=

false

for i in

range(1

, lens+1)

:for j in

range(1

, lenp+1)

:if pattern[j-1]

!='*':if

str[i-1]

== pattern[j-1]

or pattern[j-1]

=='.'

: dp[i]

[j]= dp[i-1]

[j-1

]else

: dp[i]

[j]=

false

else

:if j >=2:

# and str[i-1] != pattern[j-2]:

dp[i]

[j]= dp[i]

[j-2

]if i >=

0and j >=

2and

(str

[i-1

]== pattern[j-2]

or pattern[j-2]

=='.'):

dp[i]

[j]|

= dp[i-1]

[j]return dp[-1

][-1

]

維護乙個陣列,通過判斷phead是否in

快慢指標,走一倍速、二倍速(慢指標在第一圈就一定會和快指標相遇,因為速度二倍關係)。

不能光=僅用正反dfs的結果比較,否則樹中值全部相同的情況無法進行判斷。還可以維護乙個陣列記錄各個元素被遍歷的次序,或者先後(例如只給right + 1)。

請實現兩個函式,分別用來序列化和反序列化二叉樹

二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點(#),以 ! 表示乙個結點值的結束(value!)。

二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,重構二叉樹。

使用先序遍歷會比較方便。

class

solution

:def

serialize

(self, root):if

not root:

return

'#'return

str(root.val)

+'!'

+ self.serialize(root.left)

+'!'

+ self.serialize(root.right)

defdeserialize

(self, s)

: root, index = self.deserialize(s.split(

"!"),0

)return root

defdeserialize

(self,s,index)

:if s[index]

=='#'

:return

none

, index +

1 root = treenode(

int(s[index]))

index +=

1 root.left, index = self.deserialize(s, index)

root.right, index = self.deserialize(s, index)

return root, index

劍指offer學習筆記2

void matrix vector num,int x1,int y1,int x2,int y2 if x1 x2 if x1 x2 y1 y2 if x2 x1 1 y1 y2 x1 y1 x2 y2 template class stackwithmin else void pop t to...

劍指offer 學習筆記 樹

樹的寬度 廣度 優先遍歷 先訪問樹的第一層節點,再訪問第二層節點,直到最後一層。同一層節點中,從左到右依次訪問。二叉搜尋樹中,左子節點總是小於等於根節點,右子節點總是大於等於根節點。我們可以平均在o logn 的時間內根據節點值在二叉搜尋樹中找到乙個節點。二叉樹的特例有堆和紅黑樹。堆分最大堆和最小堆...

劍指offer筆記

對於這道題來說,書上的和leetcode上的是不一樣的。在leetcode上,是一位陣列中判斷是否有重複數字,有的話任意返回乙個就行。這個思路也有兩個 1.先用乙個排序如快排o nlogn 然後就判斷相鄰元素是否相等,若相等直接返回即可。2.用乙個集合set,遍歷陣列放進去,因為集合有唯一性,若哪個...