LeetCode日记3

(2015/11/3)node

LeetCode-36 Valid Sudoku:(easy)数组

1)使用数据结构数据结构

set<char> emptyset;函数

vector<set<char>> mp(27, emptyset);spa

2)下标0-8存储行中的数字,9-17存储列中的数字,18-26存储3×3块中数字。指针

3)双重for循环中,i表示行,9 + j表示列,18 + i / 3 + 3 * (j / 3)表示块。code



(2015/11/12)orm

LeetCode-38 Count and Say:(easy)排序

1)判断参数n,返回直接输出的部分。递归

2)双重for循环。


LeetCode-58 Length of Last Word:(easy)

LeetCode-66 Plus One:(easy)

LeetCode-67 Add Binary:(easy)


LeetCode-70 Climbing Stairs:(easy)

1)爬楼梯,裴波那契数列。

2)公式F(1)=1, F(2)=2,........F(n)=F(n-1)+F(n-2)。


LeetCode-83 Remove Duplicates from Sorted List:(easy)

1)删除已排序的链表中的重复节点。

2)处理输入为空链表的状况。

3)使用两个指针,一个记录上一个节点,一个寻找下一个不一样的节点。找到就作指针的变换(不管变换先后是否真的改变了指针)。


LeetCode-88 Merge Sorted Array:(easy)

1)题目理解:m和n是数组中已经初始化的元素。也就是说数组的大小可能比m和n大,且数组中可能有未初始化的元素。


LeetCode-100 Same Tree:(easy)

1)错误思路:分别计算出两棵树的中序遍历和先序遍历,判断他们是否相等。

错误的例子:[1,1] 和 [1,NULL,1]

2)正确思路:同时对两棵树进行遍历。递归实现。



(2015/11/13)

LeetCode-101 Symmetric Tree:(cant)

1)错误思路:对树进行 ”左子树-根-右子树“和”右子树-根-左子树“遍历后序列相等,则树是对称的。(异想天开)

错误的例子:[1,2,3,3,NULL,2,NULL]

2)正确思路:同100题,必须同时向两边进行遍历。

3)参考:https://leetcode.com/discuss/26705/15-lines-of-c-solution-8-ms

递归对二叉树进行对称遍历:

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == NULL) return true;
        else return func(root->left, root->right);
    }
private:
    bool func(TreeNode *p, TreeNode *q){
        if(p == NULL && q == NULL) return true;
        else if(p == NULL || q == NULL) return false;
        else{
            if(p->val != q->val) return false;
            else return func(p->left, q->right) && func(p->right, q->left);
        }
    }

};


LeetCode-102 Binary Tree Level Order Traversal:(easy)

对二叉树按层遍历。

1)思路:用队列存放每一层的节点的指针。


LeetCode-104 Maximum Depth of Binary Tree:(easy)

求二叉树叶子节点的最大深度。

1)思路:形参ans存放目前叶子节点的最大深度(引用);形参now存放当前此次遍历的当前深度。

class Solution {
public:
    int maxDepth(TreeNode* root) {
        int ans = 0;
        DFS(root, ans, 0);
        return ans;
    }
private:
    void DFS(TreeNode *T, int &ans, int now){
        if(T == NULL){
            if(now > ans) ans = now;
        }
        else{
            now++;
            DFS(T->left, ans, now);
            DFS(T->right, ans, now);
        }
        return;
    }
};


LeetCode-107 Binary Tree Level Order Traversal II:(easy)

LeetCode-102 Binary Tree Level Order Traversal。

1)最后在返回前,对vector<vector<int>> 变量进行一次reverse函数调用便可。


LeetCode-110 Balanced Binary Tree:(easy)

a height-balanced binary tree:a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

基本概念:

1)百度百科-平衡二叉树:空树,或者它的左右两棵子树的高度差的绝对值不超过1,而且左右两棵子树也是平衡二叉树

2)树的高度(树的深度):树中结点的最大层次。

3)结点的层次:从根开始定义起,根为第一层,根的孩子为第二层。

解题思路:

1)计算二叉树深度的子函数:

int depth(TreeNode *T){
        if(T == NULL) return 0;
        else return max(depth(T->left) + 1, depth(T->right) + 1);
    }

2)判断是不是平衡二叉树的函数(flag做为主函数中传入的标志)

    void func(TreeNode *T, bool &flag){
        if(flag == false) return;
        if(T == NULL) return;
        if(abs(depth(T->left) - depth(T->right)) > 1){
            flag = false;
            return;
        }
        else{
            func(T->left, flag);
            func(T->right, flag);
        }
    }


LeetCode-111 Minimum Depth of Binary Tree:(easy)

基本概念:

1)二叉树的minimum depth:从根到叶子结点的最短路径上,的结点数目。

2)叶子结点是左右子树都为空的结点。此题中,当只有一个根结点时,能够视根结点为叶子结点,不然不能够。

错误思路:

1)不能经过求:左右子树的树高的最小值来计算。由于求树的高度,实际上是求出了最大深度。

2)不能碰到空结点,就觉得是叶子结点。叶子结点的判断要经过左右子树。

AC代码:

class Solution {
public:
    int minDepth(TreeNode* root) {
        int mindepth = 0;
        func(root, mindepth, 0);
        return mindepth;
    }
    void func(TreeNode *T, int &mindepth, int now){
        if(T == NULL) return;
        now++;
        if(T->left == NULL && T->right == NULL){
            if(mindepth == 0) mindepth = now;
            if(now < mindepth) mindepth = now;
            return;
        }
        func(T->left, mindepth, now);
        func(T->right, mindepth, now);
        return;
    }
};


LeetCode-112 Path Sum:(easy)

1)到叶子结点进行一次判断便可。


LeetCode-118 Pascal's Triangle:(easy)

LeetCode-119 Pascal's Triangle II:(easy)(稍微修改118便可,注意这里第0层是[1],第一层是[1,1])



(2015/11/14)

LeetCode-125 Valid Palindrome:(easy)

题目理解:

回文串的判断。

1)alphanumeric characters:字母和数字字符

2)ignoring cases:例如"       ",是回文串。

C++的细节问题:

1)对string变量,从两端向中间遍历的问题。在for循环中,string的下标定义为整型变量,若定义为string::size_type,则可能会形成溢出。


LeetCode-226 Invert Binary Tree:(easy)

1)递归,一层一层向下反转便可。


LeetCode-257 Binary Tree Paths:(easy)

1)关键:判断叶子节点。

2)int转换为string。


LeetCode-235 Lowest Common Ancestor of a Binary Search Tree:(easy)(do more time)

1)递归方法

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)

结点p和q的值为1,其余结点的值为0;

树的值为树上全部节点的值的和。

每一个节点的值 =  左子树的值 + 右子树的值 + 本结点的值。(递归)

2)第一个值为2的结点,就是所要找的结点。

class Solution {
public:
	TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
		bool find = false;
		TreeNode *ans;
		func(root, ans, find, p, q);
		return ans;
	}
	int func(TreeNode *T, TreeNode *&ans, bool &find, TreeNode *p, TreeNode *q){
		if (T == NULL || find) return 0;
		int val = 0;
		if (T == p) val++;
		if (T == q) val++;
		val += func(T->left, ans, find, p, q) + func(T->right, ans, find, p, q);
		if (!find && val == 2){
			ans = T;
			find = true;
		}
		return val;
	}
};


LeetCode-94 Binary Tree Inorder Traversal:(递归easy)(迭代:参考《数据结构》)

1)迭代法思路:用栈存放子树的根结点。

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        stack<TreeNode *> stk;
        TreeNode *p = root;
        while(p || !stk.empty()){
            if(p){
                stk.push(p);
                p = p->left;
            }
            else{
                p = stk.top();
                stk.pop();
                ans.push_back(p->val);
                p = p->right;
            }
        }
        return ans;
    }
};
相关文章
相关标签/搜索