筆記主要記錄方法和知識點
知識點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,遍歷陣列放進去,因為集合有唯一性,若哪個...