LeetCode C 刷題111 115題題解

2021-10-24 08:32:41 字數 4316 閱讀 4435

目錄

111 二叉樹的最小深度 題目

題解完整**

112 路徑總和 題目

題解完整**

113 路徑總和ii 題目

題解完整**

114 二叉樹展開為鍊錶 題目

題解完整**

115 不同的子串行 題目

題解完整**

給定乙個二叉樹,找出其最小深度。

最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。

說明: 葉子節點是指沒有子節點的節點。

示例:給定二叉樹 [3,9,20,null,null,15,7],

3/ \

9  20

/  \

15   7

返回它的最小深度  2.

遞迴

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

if(root->left == nullptr && root ->right == nullptr) else if(root->left != nullptr && root ->right == nullptr) else if(root->left == nullptr && root ->right != nullptr)

return min(mindepth(root->left) + 1, mindepth(root->right) + 1);

}};

給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。

說明: 葉子節點是指沒有子節點的節點。

示例: 

給定如下二叉樹,以及目標和 sum = 22,

5/ \

4   8

/   / \

11  13  4

/  \      \

7    2      1

返回 true, 因為存在目標和為 22 的根節點到葉子節點的路徑 5->4->11->2。

遞迴

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

sum -= root->val;

if(root->left == nullptr && root->right == nullptr) else if(root->left != nullptr && root->right == nullptr) else if(root->left == nullptr && root->right != nullptr)

return haspathsum(root->left, sum) || haspathsum(root->right, sum);

}};

給定乙個二叉樹和乙個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。

說明: 葉子節點是指沒有子節點的節點。

示例:給定如下二叉樹,以及目標和 sum = 22,

5/ \

4   8

/   / \

11  13  4

/  \    / \

7    2  5   1

返回:[

[5,4,11,2],

[5,8,4,5]

]

遞迴

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

return;

}if(root->left != nullptr && root->right == nullptr)

if(root->left == nullptr && root->right != nullptr)

helper(root->left, tmp, sum);

helper(root->right, tmp, sum);

}vector> pathsum(treenode* root, int sum) ;

}helper(root, {}, sum);

return result;

}};

給定乙個二叉樹,原地將它展開為乙個單鏈表。

例如,給定二叉樹

1/ \

2   5

/ \   \

3   4   6

將其展開為:1\

2\3\

4\5\

6

遞迴+先序遍歷

/**

* definition for a binary tree node.

* struct treenode

* treenode(int x) : val(x), left(nullptr), right(nullptr) {}

* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}

* };

*/class solution

// 處理左子樹

flatten(root->left);

// 處理右子樹

treenode* r = root->right;

root->right = root->left;

root->left = nullptr;

while(root->right)

root->right = r;

flatten(root->right);

}};

給定乙個字串 s 和乙個字串 t,計算在 s 的子串行中 t 出現的個數。

乙個字串的乙個子串行是指,通過刪除一些(也可以不刪除)字元且不干擾剩餘字元相對位置所組成的新字串。(例如,"ace" 是 "abcde" 的乙個子串行,而 "aec" 不是)

題目資料保證答案符合 32 位帶符號整數範圍。

示例 1:

輸入:s = "rabbbit", t = "rabbit"

輸出:3

解釋:如下圖所示, 有 3 種可以從 s 中得到 "rabbit" 的方案。

(上箭頭符號 ^ 表示選取的字母)

rabbbit

^^^^ ^^

rabbbit

^^ ^^^^

rabbbit

^^^ ^^^

示例 2:

輸入:s = "babgbag", t = "bag"

輸出:5

解釋:如下圖所示, 有 5 種可以從 s 中得到 "bag" 的方案。 

(上箭頭符號 ^ 表示選取的字母)

babgbag

^^ ^

babgbag

^^    ^

babgbag

^    ^^

babgbag

^  ^^

babgbag

^^^

動態規劃(int溢位改long)

class solution 

for(int i = pos; i < s.size() - (t.size() - len) + 1; ++i) }}

int numdistinct(string s, string t)

*/// 動態規劃

// 如果int溢位,選擇long

public:

int numdistinct(string s, string t)

if(m == 0)

int result = 0;

vector> dp(n + 1, vector(m + 1, 0));

for(int i = 0; i <= n; ++i)

for(int i = 1; i <= n; ++i) else }}

return dp[n][m];

}};

LeetCode C 刷題 13 16題題解

羅馬數字包含以下七種字元 i,v,x,l,c,d 和 m。字元 數值 i 1 v 5 x 10 l 50 c 100 d 500 m 1000 例如,羅馬數字 2 寫做 ii 即為兩個並列的 1。12 寫做 xii 即為 x ii 27 寫做 xxvii,即為 xx v ii 通常情況下,羅馬數字中...

LeetCode C 刷題 53 56題題解

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。1 雙指標法 2...

LeetCode C 刷題 69 72題題解

實現 int sqrt int x 函式。計算並返回 x 的平方根,其中 x 是非負整數。由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。示例 1 輸入 4 輸出 2 示例 2 輸入 8 輸出 2 說明 8 的平方根是 2.82842.由於返回型別是整數,小數部分將被捨去。二分 clas...