17、Letter Combinations of a Phone Number

题目

针对输入的数字串,每一个数字都对应对个字符可以选择。因此可以直接采用递归的思想,依次遍历数字串的每一个数字,处理到当前数字时,余下的数字可以看出一个规模更小的子串来处理,这正符合递归的思想,将问题逐步化小。代码如下:

  1. class Solution {
  2. public:
  3. vector<string> phoneNumber;
  4. Solution()
  5. {
  6. phoneNumber.push_back("");
  7. phoneNumber.push_back("");
  8. phoneNumber.push_back("abc");//
  9. phoneNumber.push_back("def");
  10. phoneNumber.push_back("ghi");
  11. phoneNumber.push_back("jkl");
  12. phoneNumber.push_back("mno");
  13. phoneNumber.push_back("pqrs");
  14. phoneNumber.push_back("tuv");
  15. phoneNumber.push_back("wxyz");
  16. }
  17. vector<string> letterCombinations(string digits) {
  18. int index = ;
  19. vector<string> res;
  20. if("" == digits)
  21. {
  22. return res;
  23. }
  24. string str="";
  25. letterCombinations(digits,,res,str);
  26.  
  27. return res;
  28.  
  29. }
  30.  
  31. void letterCombinations(const string digits,int index,vector<string>&res,string str)
  32. {
  33. if(digits[index] == '\0')
  34. {
  35. res.push_back(str);
  36. return;
  37. }
  38. int count = phoneNumber[digits[index]-''].size();
  39. for(int i=;i<count;i++)
  40. {
  41. letterCombinations(digits,index+,res,str+phoneNumber[digits[index]-''][i]);
  42. }
  43. }
  44. };

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

18、4Sum(*)

题目

代码摘抄自网上:

  1. class Solution {
  2. public:
  3. vector<vector<int> > fourSum(vector<int> &num, int target) {
  4. // Start typing your C/C++ solution below
  5. // DO NOT write int main() function
  6. int nSize = num.size();
  7. vector< vector<int> > result;
  8. if (nSize < ) return result;
  9.  
  10. sort(num.begin(), num.end());
  11. vector<int> mid();
  12. set<string> isExit;
  13. for (int i = ; i < nSize - ; ++i)
  14. {
  15. mid[] = num[i];
  16. for (int j = i + ; j < nSize - ; ++j)
  17. {
  18. mid[] = num[j];
  19. int l = j + ;
  20. int r = nSize - ;
  21. int sum = target - num[i] - num[j];
  22. while(l < r)
  23. {
  24. int tmp = num[l] + num[r];
  25. if (sum == tmp)
  26. {
  27. string str;
  28. str += num[i];
  29. str += num[j];
  30. str += num[l];
  31. str += num[r];
  32. set<string>::iterator itr = isExit.find(str);
  33. if (itr == isExit.end())
  34. {
  35. isExit.insert(str);
  36. mid[] = num[l];
  37. mid[] = num[r];
  38. result.push_back(mid);
  39. }
  40. ++l;
  41. --r;
  42. }
  43. else if(sum > tmp)
  44. ++l;
  45. else
  46. --r;
  47. }
  48. }
  49. }
  50.  
  51. return result;
  52. }
  53. };

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

19、Remove Nth Node From End of List

题目

由于是单链表,如果要删除某个节点,那必须定位到该节点的前一个节点,因此,需要对该节点分类:

a.如果删除的节点是最后一个节点,该节点有前驱节点,能够定位;但是后继节点为空

b.如果删除的节点是中间某一个节点,该节点有前驱节点,能够定位。因此a情况可以和b情况直接合并为一种情况;

c.如果删除的节点是首节点,该节点没有前驱。需要特殊处理;

题目也特别要求只能遍历一遍该链表。并且n值是合法的,如果输入的n值可能是非法,那需要对n值做判断,使得函数的鲁棒性比较强。针对n值可能的输入:

a.n<=0,可以直接判断;

b.n>链表长度,需要进行判断,判断方式详见代码。

代码如下:

  1. class Solution {
  2. public:
  3. ListNode* removeNthFromEnd(ListNode* head, int n) {
  4. //双指针同步,先让某一个指针走n-1步
  5. if (NULL == head || n<=)
  6. {
  7. return NULL;
  8. }
  9. ListNode *first,*second;
  10. first = head;
  11. int i=;
  12. while(i<n)
  13. {
  14. first = first->next;
  15. if(NULL == first && i+<n)//n值大于链表长度
  16. return NULL;
  17. i++;
  18. }
  19. if(NULL == first)//删除首节点
  20. return head->next;
  21. second = head;
  22. first = first->next;
  23. while(first != NULL)
  24. {
  25. first = first->next;
  26. second = second->next;
  27. }
  28. second->next = second->next->next;
  29. return head;
  30. }
  31. };

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

20、Valid Parentheses

题目

栈的运用。直接上代码:

  1. class Solution {
  2. public:
  3. bool isValid(string s) {
  4. stack<char> myStack;
  5.  
  6. int i=;
  7. while(s[i]!='\0')
  8. {
  9.  
  10. if(s[i]=='('||s[i]=='['||s[i]=='{')
  11. {
  12. myStack.push(s[i]);
  13. }
  14. else if(s[i]==')')
  15. {
  16. if(myStack.empty())
  17. return false;
  18. if(myStack.top() == '(')
  19. myStack.pop();
  20. else
  21. return false;
  22. }
  23. else if(s[i]==']')
  24. {
  25. if(myStack.empty())
  26. return false;
  27. if(myStack.top() == '[')
  28. myStack.pop();
  29. else
  30. return false;
  31. }
  32. else if(s[i]=='}')
  33. {
  34. if(myStack.empty())
  35. return false;
  36. if(myStack.top() == '{')
  37. myStack.pop();
  38. else
  39. return false;
  40. }
  41. i++;
  42. }
  43. if(myStack.empty())
  44. return true;
  45. else
  46. return false;
  47.  
  48. }
  49. };

Leetcode题解(五)的更多相关文章

  1. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  2. LeetCode第五天

    leetcode 第五天 2018年1月6日 22.(566) Reshape the Matrix JAVA class Solution { public int[][] matrixReshap ...

  3. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  4. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  5. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  6. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  7. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

  8. 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...

  9. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

  10. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...

随机推荐

  1. HDFS的web接口

    50070端口查看NameNode状态,该端口的定义位于core-default.xml中,可以在core-site.xml中自行修改. 50075端口查看DataNode的,该地址和端口的定义位于h ...

  2. IBAction&IBOutlet

    IB:Interface Builder 1>IBAction 需要操作,例如按钮的点击 2> IBOutlet 需要获得.修改该属性 然后就可以与Storyboard建立起联系

  3. angular $compiler

    directive是如何被compiled HTML编译发生在三个阶段: 1.$compile遍历DOM节点匹配directives 如果compiler找到元素上的directive,directi ...

  4. 替换应用程序DLL动态库的详细方法步骤 (gts.dll为例)

    在C++ builder编译器IDE软件下 1.View -Project Manageer --找到需要替换的x.dll(gts.dll)对应的x.lib(gts.lib),然后Remove2.Pr ...

  5. C++Builder中MessageBox的基本用法

    C++Builder中MessageBox的基本用法 返回值:IDYES=Application->MessageBox("","",MBYESNO) i ...

  6. Qt 打开文件的默认路径 QFileDialog::getOpenFileName()

    为了说明QFileDialog::getOpenFileName()函数的用法,还是先把函数签名放在这里:   QString QFileDialog::getOpenFileName (       ...

  7. mybatis 架构

    官网地址:http://code.google.com/p/mybatis/ 版本:mybatis 3.2.3 生成工具:mybatis-generator-core-1.3.2-bundle.zip ...

  8. SLB vs CLB

    什么是SLB? SLB, 服务器负载均衡(Server Load Balancing),可以看作HSRP(热备份路由器协议)的扩展,实现多个服务器之间的负载均衡. 虚拟服务器代表的是多个真实服务器的群 ...

  9. 详解m4文件

    最近在分析speex代码,发现编译过程中需要的一个speex.m4文件不知道是何方神圣,怀着对未知知识的渴望,跑到 某哥和某基问了一下,算是认识了,为了方便以后经常见面,这里就做个记录吧. M4实际上 ...

  10. Python系列之正则表达式详解

    Python 正则表达式模块 (re) 简介 Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,和 Perl 脚本的正则表达式功能类似,使用 ...