zoukankan      html  css  js  c++  java
  • Leetcode题解(六)

    21、Merge Two Sorted Lists

    题目

    直接上代码:

    class Solution {
    public:
        ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
            ListNode *helper=new ListNode(0);
            ListNode *head=helper;
            while(l1 && l2)
            {
                 if(l1->val<l2->val) helper->next=l1,l1=l1->next;
                 else helper->next=l2,l2=l2->next;
                 helper=helper->next;
            }
            if(l1) helper->next=l1;
            if(l2) helper->next=l2;
            return head->next;
        }
    };

     -------------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------

    22、Generate Parentheses

    题目

    题目分析:

    在构造这个括号字符串时,分别用left和right表示剩下的左括号和右括号个数,str表示已经构造出的字符串。通过分析,可以找出如下关系:

    a.当left==right时,只能进行str+‘(’操作;

    b.当left<right并且left != 0,可以进行str+')'或者str+‘(’操作,相应的符号个数将减少1;

    c.当left>right,这种情况肯定不存在;

    实现代码如下:

     1 class Solution {
     2 public:
     3     vector<string> generateParenthesis(int n) {
     4         vector<string> res;
     5         string str="";
     6         generateParenthesis(res,n,n,str);
     7 
     8         return res;
     9 
    10     }
    11     void generateParenthesis(vector<string> &res,int left,int right,string str)
    12     {
    13         if(0 == left)
    14         {
    15             for(int i=0;i<right;i++)
    16                 str += ')';
    17 
    18             res.push_back(str);
    19             return;
    20         }
    21         else
    22         {
    23             if(left == right)
    24                 generateParenthesis(res,left-1,right,str+'(');
    25             else
    26             {
    27                 generateParenthesis(res,left-1,right,str+'(');
    28                 generateParenthesis(res,left,right-1,str+')');
    29             }
    30         }
    31     }
    32 };

    上面的实现过程是递归实现,既然能用递归,那就能通过使用stack的方式直接求解而不用递归。

    非递归的方法:每次stack压栈压入一个三元组(left,righ,str)。

     1 struct node
     2 {
     3     node(int l,int r,string s)
     4     {
     5         left = l;
     6         right = r;
     7         str = s;
     8     }
     9     int left;
    10     int right;
    11     string str;
    12 };
    13  
    14 class Solution {
    15 public:
    16     vector<string> generateParenthesis(int n) {
    17         vector<string> res;
    18         string str="";
    19         stack< node* > mystack;
    20         int l = n-1;
    21         int r = n;
    22 
    23         node *temp = new node(l,r,"(");
    24         mystack.push(temp);
    25         while(!mystack.empty())
    26         {
    27             temp = mystack.top();
    28             mystack.pop();
    29             if(temp->left == 0)
    30             {
    31                 for(int i=0;i<temp->right;i++)
    32                     temp->str += ')';
    33                 res.push_back(temp->str);
    34                 continue;
    35             }
    36             if(temp->left == temp->right)
    37             {
    38                 mystack.push(new node(temp->left -1,temp->right,temp->str+'('));
    39             }
    40             else
    41             {
    42                 mystack.push(new node(temp->left -1,temp->right,temp->str+'('));
    43                 mystack.push(new node(temp->left,temp->right - 1,temp->str+')'));
    44             }
    45         }
    46         return res;
    47 
    48     }
    49 };

     ----------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------

    23、Merge k Sorted Lists

    题目

    这道题目可以仿照21题,一次对每一个链表就行merge,也就是L0和L1进行merge,得到的结果再和L2进行Merge。代码如下:

     1 class Solution {
     2 public:
     3     ListNode* mergeKLists(vector<ListNode*>& lists) {
     4         int count = lists.size();
     5         int i=1;
     6         if(lists.empty())
     7             return NULL;
     8         ListNode* first,*second,*temp;
     9         first = lists[0];
    10         for (;i<count;i++)
    11         {
    12             temp = mergeTwoLists(first,lists[i]);
    13             first = temp;
    14         }
    15         return first;
    16     }
    17     ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
    18         ListNode *helper=new ListNode(0);
    19         ListNode *head=helper;
    20         while(l1 && l2)
    21         {
    22             if(l1->val<l2->val) helper->next=l1,l1=l1->next;
    23             else helper->next=l2,l2=l2->next;
    24             helper=helper->next;
    25         }
    26         if(l1) helper->next=l1;
    27         if(l2) helper->next=l2;
    28         return head->next;
    29     }
    30 };

    但是,这样提交的话,会超时。不能通过。

    对算法进行改进,首先L0和L1进行Merge,L2和L3进行Merge。。。如此循环,把得到的结果再Merge,直到最后得出结果。

    代码如下:

     1 class Solution {
     2 public:
     3     ListNode* mergeKLists(vector<ListNode*>& lists) {
     4         int count = lists.size();
     5         int i=0;
     6         if(lists.empty())
     7             return NULL;
     8         queue<ListNode*> myque;
     9         ListNode* first,*second,*temp;
    10         first = lists[0];
    11         for (;i+2<=count;i+=2)
    12         {
    13             temp = mergeTwoLists(lists[i],lists[i+1]);
    14             myque.push(temp);
    15         }
    16         if(i<count)
    17             myque.push(lists[i]);
    18         while (!myque.empty())
    19         {
    20             first = myque.front();
    21             myque.pop();
    22             if(myque.empty())
    23                 return first;
    24             second = myque.front();
    25             myque.pop();
    26             temp = mergeTwoLists(first,second);
    27             myque.push(temp);
    28 
    29         }
    30         return first;
    31     }
    32     ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
    33         ListNode *helper=new ListNode(0);
    34         ListNode *head=helper;
    35         while(l1 && l2)
    36         {
    37             if(l1->val<l2->val) helper->next=l1,l1=l1->next;
    38             else helper->next=l2,l2=l2->next;
    39             helper=helper->next;
    40         }
    41         if(l1) helper->next=l1;
    42         if(l2) helper->next=l2;
    43         return head->next;
    44     }
    45 };
  • 相关阅读:
    java23种设计模式-结构型模式-适配器模式
    java23种设计模式-创建者模式-抽象工厂模式
    java23种设计模式-创建者模式-工厂模式
    从jvm运行数据区分析字符串是否相同
    Linux常见安全策略
    MySQL 报错案例分析
    Linux系统网络监控工具
    海量运维架构
    Linux运维面试技巧
    DBA机遇于风险并存
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/5017247.html
Copyright © 2011-2022 走看看