17、Letter Combinations of a Phone Number

题目

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

class Solution {
public:
vector<string> phoneNumber;
Solution()
{
phoneNumber.push_back("");
phoneNumber.push_back("");
phoneNumber.push_back("abc");//
phoneNumber.push_back("def");
phoneNumber.push_back("ghi");
phoneNumber.push_back("jkl");
phoneNumber.push_back("mno");
phoneNumber.push_back("pqrs");
phoneNumber.push_back("tuv");
phoneNumber.push_back("wxyz");
}
vector<string> letterCombinations(string digits) {
int index = ;
vector<string> res;
if("" == digits)
{
return res;
}
string str="";
letterCombinations(digits,,res,str); return res; } void letterCombinations(const string digits,int index,vector<string>&res,string str)
{
if(digits[index] == '\0')
{
res.push_back(str);
return;
}
int count = phoneNumber[digits[index]-''].size();
for(int i=;i<count;i++)
{
letterCombinations(digits,index+,res,str+phoneNumber[digits[index]-''][i]);
}
}
};

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

18、4Sum(*)

题目

代码摘抄自网上:

 class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int nSize = num.size();
vector< vector<int> > result;
if (nSize < ) return result; sort(num.begin(), num.end());
vector<int> mid();
set<string> isExit;
for (int i = ; i < nSize - ; ++i)
{
mid[] = num[i];
for (int j = i + ; j < nSize - ; ++j)
{
mid[] = num[j];
int l = j + ;
int r = nSize - ;
int sum = target - num[i] - num[j];
while(l < r)
{
int tmp = num[l] + num[r];
if (sum == tmp)
{
string str;
str += num[i];
str += num[j];
str += num[l];
str += num[r];
set<string>::iterator itr = isExit.find(str);
if (itr == isExit.end())
{
isExit.insert(str);
mid[] = num[l];
mid[] = num[r];
result.push_back(mid);
}
++l;
--r;
}
else if(sum > tmp)
++l;
else
--r;
}
}
} return result;
}
};

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

19、Remove Nth Node From End of List

题目

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

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

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

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

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

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

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

代码如下:

class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//双指针同步,先让某一个指针走n-1步
if (NULL == head || n<=)
{
return NULL;
}
ListNode *first,*second;
first = head;
int i=;
while(i<n)
{
first = first->next;
if(NULL == first && i+<n)//n值大于链表长度
return NULL;
i++;
}
if(NULL == first)//删除首节点
return head->next;
second = head;
first = first->next;
while(first != NULL)
{
first = first->next;
second = second->next;
}
second->next = second->next->next;
return head;
}
};

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

20、Valid Parentheses

题目

栈的运用。直接上代码:

 class Solution {
public:
bool isValid(string s) {
stack<char> myStack; int i=;
while(s[i]!='\0')
{ if(s[i]=='('||s[i]=='['||s[i]=='{')
{
myStack.push(s[i]);
}
else if(s[i]==')')
{
if(myStack.empty())
return false;
if(myStack.top() == '(')
myStack.pop();
else
return false;
}
else if(s[i]==']')
{
if(myStack.empty())
return false;
if(myStack.top() == '[')
myStack.pop();
else
return false;
}
else if(s[i]=='}')
{
if(myStack.empty())
return false;
if(myStack.top() == '{')
myStack.pop();
else
return false;
}
i++;
}
if(myStack.empty())
return true;
else
return false; }
};

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. 系统学习java高并发系列二

    转载请注明原创出处,谢谢! 什么是线程? 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程 ...

  2. swift 开发学习问题

    1 UITableViewController 问题: [UITableView dequeueReusableCellWithIdentifier:forIndexPath:], unable to ...

  3. 初识HBase

    现如今,分布式架构大行其道,实际项目中使用HBase也是比比皆是.虽说自己在分布式方面接触甚少,但作为程序猿还是需要不断的给自己充电的.网上搜索了一些教程,还是觉得<HBase权威指南>不 ...

  4. linux free命令解读

    $ free -m total used free shared buffers cached Mem: 1002 769 232 0 62 421 -/+ buffers/cache: 286 71 ...

  5. linux cpu load学习笔记

    linux系统中的Load对当前CPU工作量的度量 Load Average 就是一段时间 (1 分钟.5分钟.15分钟) 内平均Load. [root@CNC-BJ-5-3N1 ~]# w 20:0 ...

  6. Vim的基本使用(一)

    本文为原创文章,转载请标明出处 目录 1.移动光标 2.屏幕滚动 3.模式查找 4.位置标记 5.删除文本 6.撤销与重做 7.插入文本 8.复制与移动 9.修改文本 10.写入与退出 1. 移动光标 ...

  7. CPU 分类

    Single Core :单核CPU Dual Core   :双核CPU Quad Core  :四核CPU Hexa Core  :六核CPU Octa Core   :八核CPU 参考: htt ...

  8. J2EE走向成功路-02-Struts2 配置(Maven)

    在上一篇中,介绍了使用jar包搭建Struts2框架,这一篇中来介绍一下在Maven环境下搭建Struts2框架,主要为配置Maven. 1.下载Maven,官网:http://maven.apach ...

  9. 【特效】jquery选项卡插件,页面多个选项卡统一调用

    把选项卡整合了一下,写成个插件,这样可以整个站,或整个页面有多个选项卡时,统一调用.代码的具体注意事项已经写进注释了.用于js获取元素的class名称必须有,选项卡本身的样式,另再取一个名字来设置(本 ...

  10. Java中public,protected,default,private的访问权限问题(简明扼要)

    import packa.*;//导入了packa包中所有的类.(不包括包中的子包)一般不会用,用哪个导入哪个. 导包的原则:用到哪个类,就导入哪个类.所有字母都小写. 权限列表:   public ...