LeetCode题解整理版(二)

来源:互联网 发布:二维动画软件 编辑:程序博客网 时间:2024/06/08 11:29

Reverse Words in a String

将abc def形式的字符串翻转成def abc,并且去掉多余的空格。

之后执行以下翻转思想:
1、从字符串末尾处遍历。遇到非空格的字符压入栈中,即push_back到temp中储存。遇到空格或者下标<0,即执行2。
2、将temp翻转。
3、翻转后的temp即是一个单词、追加于ss之后。
循环以上。既得翻转序列。

以下是完整代码:
[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. class Solution {  
  2. public:  
  3. void reverseWords(string & s)  
  4. {  
  5.   
  6.     string ss;  
  7.     int i = s.length()-1;  
  8.     while(i>=0)  
  9.     {  
  10.         while(i>=0&&s[i] == ' ')  
  11.         {  
  12.             i --;  
  13.         }  
  14.         if(i<0) break;  
  15.         if(ss.length()!=0)  
  16.             ss.push_back(' ');  
  17.         string temp ;  
  18.         for(;i>=0&&s[i]!=' ';i--)  
  19.             temp.push_back(s[i]);  
  20.         reverse(temp.begin(),temp.end());  
  21.         ss.append(temp);  
  22.     }  
  23.     s=ss;  
  24. }  
  25. }; 

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

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class Solution {  
  2.     // Keep the previous value in inorder traversal.  
  3.     TreeNode pre = null;  
  4.       
  5.     public boolean isValidBST(TreeNode root) {  
  6.         // Traverse the tree in inorder.  
  7.         if (root != null) {  
  8.             // Inorder traversal: left first.  
  9.             if (!isValidBST(root.left)) return false;  
  10.               
  11.             // Compare it with the previous value in inorder traversal.  
  12.             if (pre != null && root.val <= pre.val) return false;  
  13.               
  14.             // Update the previous value.  
  15.             pre = root;  
  16.               
  17.             // Inorder traversal: right last.  
  18.             return isValidBST(root.right);  
  19.         }  
  20.         return true;  
  21.      }  
  22. }  

Interleaving String

判断C串是否有A串和B串组成(就是说C中提取出A之后剩下B)

方法:DP

dp[i][j]表示s1的前i项和s2的前j项是否可以组成s3的前i+j项; 
因此构建递推式为:

<code class="hljs markdown has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">dp[<span class="hljs-link_label" style="box-sizing: border-box;">i + 1</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">j + 1</span>] = dp[<span class="hljs-link_label" style="box-sizing: border-box;">i</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">j + 1</span>] && (s1[i] == s3[i + j + 1])||dp[<span class="hljs-link_label" style="box-sizing: border-box;">i + 1</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">j</span>] && (s2[j] == s3[i + j + 1])</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">class Solution {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>:    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> <span class="hljs-title" style="box-sizing: border-box;">isInterleave</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> s1, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> s2, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">string</span> s3) {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> m = s1.length();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> n = s2.length();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(m + n != s3.length()) {            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>;        }        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">bool</span> dp[m + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>][n + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>];        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//initial</span>        dp[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < m; ++i) {            dp[i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] = dp[i][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] && (s1[i] == s3[i]);        }        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; j < n; ++j) {            dp[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>][j + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] = dp[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>][j] && (s2[j] == s3[j]);        }        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < m; ++i) {            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; j < n; ++j) {                dp[i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>][j + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] = (dp[i][j + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] && (s1[i] == s3[i + j + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>])) || (dp[i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>][j] && (s2[j] == s3[i + j + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]));            }        }        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> dp[m][n];    }};</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul>

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,找到一个数作为根结点,剩余的数分别划入左子树或者右子树。


  1. /** 
  2.  * Definition for binary tree 
  3.  * struct TreeNode { 
  4.  *     int val; 
  5.  *     TreeNode *left; 
  6.  *     TreeNode *right; 
  7.  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} 
  8.  * }; 
  9.  */  
  10. class Solution {  
  11. public:  
  12.     vector<TreeNode *> generateTrees(int n) {  
  13.        return createTree(1,n);  
  14.     }  
  15.       
  16.     vector<TreeNode *> createTree(int start, int end)  
  17.     {  
  18.         vector<TreeNode *> results;  
  19.         if(start>end)  
  20.         {  
  21.             results.push_back(NULL);  
  22.             return results;  
  23.         }  
  24.           
  25.         for(int k=start;k<=end;k++)  
  26.         {  
  27.             vector<TreeNode *> left = createTree(start,k-1);  
  28.             vector<TreeNode *> right = createTree(k+1,end);  
  29.             for(int i=0;i<left.size();i++)  
  30.             {  
  31.                 for(int j=0;j<right.size();j++)  
  32.                 {  
  33.                     TreeNode * root = new TreeNode(k);  
  34.                     root->left = left[i];  
  35.                     root->right = right[j];  
  36.                     results.push_back(root);  
  37.                 }  
  38.             }  
  39.         }  
  40.         return results;  
  41.     }  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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],  []]

和Subsets I的唯一区别就是添加了两行去重的代码。

[cpp] view plain copy
 print?
  1. void findsubset(vector<int> s, int index, vector<int> &subset, vector<vector<int>> &res)  
  2.     {  
  3.         res.push_back(subset);  
  4.         for(int i = index; i< s.size(); i++)  
  5.         {  
  6.             if(i!=index && s[i]==s[i-1])continue;  
  7.             subset.push_back(s[i]);  
  8.             findsubset(s,i+1,subset,res);  
  9.             subset.pop_back();  
  10.         }  
  11.     }  
  12.     vector<vector<int> > subsetsWithDup(vector<int> &S) {  
  13.         // Note: The Solution object is instantiated only once.  
  14.         vector<vector<int>> res;  
  15.         sort(S.begin(),S.end());  
  16.         vector<int> subset;  
  17.         findsubset(S,0,subset,res);  
  18.         return res;  
  19.     }  

0 0
原创粉丝点击