求和路徑
想法是先求樹高,然後對樹做乙個遍歷,對於每乙個節點,用乙個陣列儲存路徑上的所有節點的值,每次對陣列求和,如果恰好等於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標準 加入開...