給定三個字串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。動態規劃示例 1:
輸入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
輸出:true
示例 2:
輸入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
輸出:false
class solution
auto f = vector>(m + 1, vector(n + 1, false));
f[0][0] = 1;
for(int i = 0; i <= m; i++)
if(j > 0) }}
return f[m][n];
}};
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。方法一:迭代假設乙個二叉搜尋樹具有如下特徵:
節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例 1:
輸入:2
/ \1 3
輸出: true
示例 2:
輸入:5
/ \1 4
/ \3 6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
根節點的值為 5 ,但是其右子節點值為 4 。
方法二:遞迴
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
// stackarr;
// arr.push(root);
// while(!arr.empty())
// arr.push(node->left);
// }
// // 判斷右節點
// if(node->right != nullptr)
// arr.push(node->right);
// }
// }
// return true;
// }
// 方法二:遞迴
bool result;
int step = 0;
int min_val = 0;
void isvalid(treenode* root)
if(root) else
min_val = root->val;
}min_val = root->val;
}if(root -> right)
}bool isvalidbst(treenode* root)
result = true;
isvalid(root);
return result;
}};
二叉搜尋樹中的兩個節點被錯誤地交換。遞迴請在不改變其結構的情況下,恢復這棵樹。
示例 1:
輸入: [1,3,null,null,2]1/
3\2輸出: [3,1,null,null,2]3/
1\2示例 2:
輸入: [3,1,4,null,null,2]
3/ \
1 4/2
輸出: [2,1,4,null,null,3]
2/ \
1 4/3
高階:使用 o(n) 空間複雜度的解法很容易實現。
你能想出乙個只使用常數空間的解決方案嗎?
/**
* 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
recover(root->left);
if(last != nullptr && root->val < last->val)
t2 = root;
}last = root;
recover(root->right);
}public:
void recovertree(treenode* root)
recover(root);
int tmp = t1->val;
t1->val = t2->val;
t2->val = tmp;
}};
給定兩個二叉樹,編寫乙個函式來檢驗它們是否相同。遞迴如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的。
示例 1:
輸入: 1 1
/ \ / \
2 3 2 3
[1,2,3], [1,2,3]
輸出: true
示例 2:
輸入: 1 1
/ \
2 2
[1,2], [1,null,2]
輸出: false
示例 3:
輸入: 1 1
/ \ / \
2 1 1 2
[1,2,1], [1,1,2]
輸出: false
/**
* 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
if((!p && q) || (!q && p))
if(p->val != q->val)
if(issame(p->left, q->left) && issame(p->right, q->right))
return false;
}public:
bool issametree(treenode* p, treenode* q)
if(!p && q)
if(!q && p)
return issame(p, q);
}};
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...