leetcode隨記備忘(11)

2021-10-07 08:27:21 字數 1956 閱讀 6903

求和路徑

想法是先求樹高,然後對樹做乙個遍歷,對於每乙個節點,用乙個陣列儲存路徑上的所有節點的值,每次對陣列求和,如果恰好等於sum就將結果+1.在這個過程中,傳入當前節點的高度。路徑的陣列只需要乙個,它恰好會隨著遍歷的過程更新。**如下:

class

solution

intget_high

(treenode* root)

void

get_sum

(treenode* root, vector<

int>

& path,

int level,

int sum)

get_sum

(root-

>left, path, level+

1, sum)

;get_sum

(root-

>right, path, level+

1, sum);}

};

首個共同祖先

兩個節點的共同祖先有這樣幾種情況:

1.如果p,q恰好分別在某個節點的左右子樹上,那麼該節點就是所求的。

2.p在q的某棵子樹上(或者相反)。那麼q就是所求的。

class

solution

};

插入

肯定用bitset。一開始還想著操作一下,後來發現直接賦值就行了。這裡主要是再次mark一下bitset的一些操作。

1。初始化

bitset<32> b1(m); //將b1賦值為m。

2.取值

b1[0]是數的最低位。如果m=1,則b1[0]=1.也就是說這個陣列的順序與平時閱讀的陣列是相反的。

3.轉換成數字或字串

bitset<8> foo (「10011011」);

string s = foo.to_string();  //將bitset轉換成string型別

unsigned long a = foo.to_ulong();  //將bitset轉換成unsigned long型別

unsigned long long b = foo.to_ullong();  //將bitset轉換成unsigned long long型別

**如下:

class

solution

};

反轉數字我的想法是先用一次遍歷將陣列中連續的1的塊的起始位置都標註出來。然後再看這些塊中有沒有相鄰的。用max先統計連續1的最大長度,再統計相鄰的1的長度。但是時間不是很好。**如下:

class

solution

else

if(flag &&

!b[i])}

res =

min(

32, res+1)

;if(v.size()

<2)

return res;

for(

int i =

1; i < v.

size()

; i++

)return res;}}

;

leetcode隨記備忘(3)

除自身以外陣列乘積 這道題不能用除法,所以我們可以從後往前以及從前往後兩次遍歷。由於輸出空間不算空間複雜度,所以可以先把正序的結果放進輸出空間,在逆序的時候對應乘一下就行了,這樣應該就算是o 1 的空間複雜度。如下 class solution prod 1 for int i length 2 i...

leetcode隨記備忘(4)

反轉整數 問題並不難,但是在答案那裡看到了很精彩的解法。貼一下別人的解法。相比之下我的按部就班做法就顯得很蠢。class solution return num 2的冪這裡可以用乙個trick。因為2的冪的二進位制中只有乙個1,而 n n 1 可以消去二進位制末尾的0.所以操作一次後判斷是否為0即可...

MinGW編譯C 11備忘

author wang hanbin date nov 21th,2013 include using namespace std int main for double x prices std cout 一段使用了c 11特性的 直接使用mingw編譯會報錯,因為預設使用的是c 98標準 加入開...