LeetCode题解整理版(二)
来源:互联网 发布:二维动画软件 编辑:程序博客网 时间:2024/06/08 11:29
Reverse Words in a String
将abc def形式的字符串翻转成def abc,并且去掉多余的空格。
- class Solution {
- public:
- void reverseWords(string & s)
- {
- string ss;
- int i = s.length()-1;
- while(i>=0)
- {
- while(i>=0&&s[i] == ' ')
- {
- i --;
- }
- if(i<0) break;
- if(ss.length()!=0)
- ss.push_back(' ');
- string temp ;
- for(;i>=0&&s[i]!=' ';i--)
- temp.push_back(s[i]);
- reverse(temp.begin(),temp.end());
- ss.append(temp);
- }
- s=ss;
- }
- };
Recover Binary Search Tree
一棵二叉搜索树中两个节点错误,修正这棵树。
正确二叉树中序遍历应该是递增,而交换了两个节点后会导致有一处或者两处某节点值小于前一个节点,记录,最后交换即可。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class
Solution {
public
:
TreeNode *p,*q;
TreeNode *prev;
void
recoverTree(TreeNode *root)
{
p=q=prev=NULL;
inorder(root);
swap(p->val,q->val);
}
void
inorder(TreeNode *root)
{
if
(root->left)inorder(root->left);
if
(prev!=NULL&&(prev->val>root->val))
{
if
(p==NULL)p=prev;
q=root;
}
prev=root;
if
(root->right)inorder(root->right);
}
};
Validate Binary Search Tree
题意:判断一个二叉树是否为二分查找树。
何为二分查找树?1) 左子树的值都比根节点小;2) 右子树的值都比根节点大;3) 左右子树也必须满足上面两个条件。
需要注意的是,左子树的所有节点都要比根节点小,而非只是其左孩子比其小,右子树同样。这是很容易出错的一点是,很多人往往只考虑了每个根节点比其左孩子大比其右孩子小。如下面非二分查找树,如果只比较节点和其左右孩子的关系大小,它是满足的。
5
/ \
4 10
/ \
3 11
- public class Solution {
- // Keep the previous value in inorder traversal.
- TreeNode pre = null;
- public boolean isValidBST(TreeNode root) {
- // Traverse the tree in inorder.
- if (root != null) {
- // Inorder traversal: left first.
- if (!isValidBST(root.left)) return false;
- // Compare it with the previous value in inorder traversal.
- if (pre != null && root.val <= pre.val) return false;
- // Update the previous value.
- pre = root;
- // Inorder traversal: right last.
- return isValidBST(root.right);
- }
- return true;
- }
- }
Interleaving String
判断C串是否有A串和B串组成(就是说C中提取出A之后剩下B)
方法:DP
dp[i][j]表示s1的前i项和s2的前j项是否可以组成s3的前i+j项;
因此构建递推式为:
Unique Binary Search Trees II
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
思路:
类似http://blog.csdn.net/lanxu_yy/article/details/17504123,找到一个数作为根结点,剩余的数分别划入左子树或者右子树。- /**
- * Definition for binary tree
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
- * };
- */
- class Solution {
- public:
- vector<TreeNode *> generateTrees(int n) {
- return createTree(1,n);
- }
-
- vector<TreeNode *> createTree(int start, int end)
- {
- vector<TreeNode *> results;
- if(start>end)
- {
- results.push_back(NULL);
- return results;
- }
-
- for(int k=start;k<=end;k++)
- {
- vector<TreeNode *> left = createTree(start,k-1);
- vector<TreeNode *> right = createTree(k+1,end);
- for(int i=0;i<left.size();i++)
- {
- for(int j=0;j<right.size();j++)
- {
- TreeNode * root = new TreeNode(k);
- root->left = left[i];
- root->right = right[j];
- results.push_back(root);
- }
- }
- }
- return results;
- }
123456789101112131415161718192021222324public
class
Solution {
public
ArrayList<TreeNode> generateTrees(
int
n) {
return
generateTrees(
1
, n);
}
public
ArrayList<TreeNode> generateTrees(
int
start,
int
end){
ArrayList<TreeNode> unique =
new
ArrayList<TreeNode>();
if
(start > end){
unique.add(
null
);
return
unique;
}
for
(
int
i = start; i <= end; i++){
for
(TreeNode left: generateTrees(start, i -
1
)){
for
(TreeNode right: generateTrees(i +
1
, end)){
TreeNode root =
new
TreeNode(i);
root.left = left;
root.right = right;
unique.add(root);
}
}
}
return
unique;
}
}
public
class
Solution {
public
ArrayList<TreeNode> generateTrees(
int
n) {
return
generateTrees(
1
, n);
}
public
ArrayList<TreeNode> generateTrees(
int
start,
int
end){
ArrayList<TreeNode> unique =
new
ArrayList<TreeNode>();
if
(start > end){
unique.add(
null
);
return
unique;
}
for
(
int
i = start; i <= end; i++){
for
(TreeNode left: generateTrees(start, i -
1
)){
for
(TreeNode right: generateTrees(i +
1
, end)){
TreeNode root =
new
TreeNode(i);
root.left = left;
root.right = right;
unique.add(root);
}
}
}
return
unique;
}
}
Reverse Linked List II
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution {10 public:11 ListNode *reverseBetween(ListNode *head, int m, int n) {12 // Start typing your C/C++ solution below13 // DO NOT write int main() function14 if (head == NULL)15 return NULL;16 17 ListNode *q = NULL;18 ListNode *p = head;19 for(int i = 0; i < m - 1; i++)20 {21 q = p;22 p = p->next;23 }24 25 ListNode *end = p;26 ListNode *pPre = p;27 p = p->next;28 for(int i = m + 1; i <= n; i++)29 {30 ListNode *pNext = p->next;31 32 p->next = pPre;33 pPre = p;34 p = pNext;35 }36 37 end->next = p;38 if (q)39 q->next = pPre;40 else41 head = pPre;42 43 return head;44 }45 };
Subsets II
Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], []]
- LeetCode题解整理版(二)
- LeetCode题解整理版(二)
- LeetCode题解整理版(一)
- LeetCode题解整理版(一)
- leetcode 题解 整理
- LeetCode题解(二)
- Leetcode 题解系列(二)
- leetcode 题解代码整理 1-5题
- leetcode 题解代码整理 6-10题
- leetcode 题解代码整理 11-15题
- leetcode 题解代码整理 16-20题
- leetcode 题解代码整理 21-25题
- leetcode 题解代码整理 26-30题
- leetcode 题解代码整理 31-35题
- leetcode 题解代码整理 36-40题
- LeetCode代码整理(二)
- 二、[LeetCode OJ]Two Sum题解
- leetcode题解
- NVIDIA驱动安装问题
- 虚妄是精神上的鸦片
- 快速特征点直方图描述器(FPFH)
- 流行的下拉刷新开源库
- 代码篇——Easyui的formatter实现超链接跳转页面
- LeetCode题解整理版(二)
- [LintCode] 跳跃游戏
- linux指令之 cd
- 有关iOS打包成IPA格式
- GraphLab Create API 中文文档 - 数据工程 - graphlab.SFrame
- JPA开发
- Python 练习实例9
- maven环境变量
- Lowest Common Multiple Plus(数论)