[LeetCode C++实现]36. Valid Sudoku

36. Valid Sudoku

class Solution {

public:

bool isValidSudoku(vector<vector<char>>& board) {

//row[m][n]代表第m+1行是否已使用数字n+1

//col[m][n]代表第m+1列是否已使用数字n+1

//sub_33[m][n]将格子分成了9个小的3x3,m代表第几个3x3小格子,n代表n+1是否已使用

int row[9][9] ={0},col[9][9]={0},sub_33[9][9]={0};

for(int i = 0;i < board.......

[LeetCode C++实现]208. Implement Trie (Prefix Tree)

208. Implement Trie (Prefix Tree)

实现思路是每个结点保存一个26个指针数组,在插入的时候建立前后关系,查询完整单词依赖is_word,而查询前缀只要单词长度查完,没有出现NULL即匹配,完整代码如下(包含析构函数):

class TrieNode {

public:

// Initialize your data structure here.

bool is_word;

TrieNode *children[26];

TrieNode() {

is_word = false;

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

chi......

[LeetCode C++实现]52. N-Queens II

52. N-Queens II

52的解法相对比51更简单,无需保存具体的结果,只是统计符合条件解法的个数。代码从51的解法稍加修改:

class Solution {

public:

int totalNQueens(int n) {

vector<string> nQueens(n,string(n,'.'));

int cnt = 0;

solveNQueens(nQueens,0,n,cnt);

return cnt;

}

private:

void solveNQueens(vector<string> &nQueens, int row,......

[LeetCode C++实现]51. N-Queens

51. N-Queens

非常经典的问题,这里使用DFS解决,代码如下:

class Solution {

public:

vector<vector<string>> solveNQueens(int n) {

vector<vector<string>> res;

vector<string> nQueens(n,string(n,'.'));

solveNQueens(res,nQueens,0,n);

return res;

}

private:

void solveNQueens(vector<vector&l......

[LeetCode C++实现]111. Minimum Depth of Binary Tree

非递归解法可以套用广度优先算法解法,在循环中添加判断条件,如果节点左右子树均为NULL,则最小深度就在该层。

/**

* Definition for a binary tree node.

* struct TreeNode {

* int val;

* TreeNode *left;

* TreeNode *right;

* TreeNode() : val(0), left(nullptr), right(nullptr) {}

* TreeNode(int x) : val(x), left(nullptr), right(nullptr)......

[LeetCode C++实现]104. Maximum Depth of Binary Tree

C语言实现:

/**

* Definition for a binary tree node.

* struct TreeNode {

* int val;

* struct TreeNode *left;

* struct TreeNode *right;

* };

*/

int maxDepth(struct TreeNode* root)

{

if(NULL == root)

{

return 0;

}

int llen = maxDepth(root->left) + 1;

int rlen = maxDepth(root->right) ......

[LeetCode C++实现]102. Binary Tree Level Order Traversal

二叉树广度优先算法(水平搜索),使用队列保存各节点,初步完成能编译通过代码:

/**

* Definition for a binary tree node.

* struct TreeNode {

* int val;

* TreeNode *left;

* TreeNode *right;

* TreeNode() : val(0), left(nullptr), right(nullptr) {}

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

* TreeNo......

[LeetCode C++实现]122. Best Time to Buy and Sell Stock II

贪心算法:

贪心法又称贪心算法、贪婪算法,在对问题求解时,总是做出在当前看来最好的选择。

简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。这种子问题最优解称为最优子结构。

贪心算法与动态规划的不同在于它对每个子问题的解决方案做的选择不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。

一个例子说明贪心算法与动态规划的不同:

假如有面值20 10 5 1的四种纸币,那么要兑换36块钱,最少需要几张纸币?

36 -20 = 16

16 - 10 = 6

6 - 5 = 1

1 - 1 = 0

所以一共需要4张纸币......

[LeetCode C++实现]236. Lowest Common Ancestor of a Binary Tree

236. Lowest Common Ancestor of a Binary Tree

和235题类似,236的答案可以放在235里AC,但235是二叉搜索树,可以利用该特性优化代码实现。

/**

* Definition for a binary tree node.

* struct TreeNode {

* int val;

* TreeNode *left;

* TreeNode *right;

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

* };

*/

class Soluti......

[LeetCode C++实现]235. Lowest Common Ancestor of a Binary Search Tree

235. Lowest Common Ancestor of a Binary Search Tree

先用最ugly 最随心所欲的代码AC,基本思想是生成两个路径,然后找到最后一个相同的值,然后在BST中查找到这个值返回结点地址,最直观,最容易理解,代码相对啰嗦。

/**

* Definition for a binary tree node.

* struct TreeNode {

* int val;

* TreeNode *left;

* TreeNode *right;

* TreeNode(int x) : val(x), left(NULL......