Leetcode题解(五)
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题解(五)的更多相关文章
- 【LeetCode题解】二叉树的遍历
		
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
 - LeetCode第五天
		
leetcode 第五天 2018年1月6日 22.(566) Reshape the Matrix JAVA class Solution { public int[][] matrixReshap ...
 - leetcode题解-122买卖股票的最佳时期
		
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
 - 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
		
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
 - 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)
		
目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...
 - 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)
		
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
 - 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
		
目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...
 - 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)
		
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...
 - 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)
		
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...
 - 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)
		
目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...
 
随机推荐
- jQuery自定义插件--banner图滚动
			
前言 jQuery是一个功能强大的库,提供了开发JavaScript项目所需的所有核心函数.很多时候我们使用jQuery的原因就是因为其使用插件的功能,然而,有时候我们还是需要使用自定义代码来扩展这些 ...
 - 01.python基础知识_01
			
一.编译型语言和解释型语言的区别是什么? 1.编译型语言将源程序全部编译成机器码,并把结果保存为二进制文件.运行时,直接使用编译好的文件即可 2.解释型语言只在执行程序时,才一条一条的解释成机器语言给 ...
 - JS -- Variables As Properties
			
Variables As Properties When you declare a global JavaScript variable, what you are actually doing i ...
 - mysql更新某个字符串字段的部分内容
			
如果现在需要Mysql更新字段重部分数据,而不是全部数据,应该采用何种方法呢?下面介绍了两种情况下Mysql更新字段中部分数据的方法,供您参考. Mysql更新字段中部分数据第一种情况: update ...
 - Hive基础(5)---内部表 外部表 临时表
			
1.外部表 关键字:EXTERNAL 外部表创建时需要指定LOCATION 删除外部表时,数据不被删除 CREATE EXTERNAL TABLE page_view(viewTime INT, us ...
 - Oracle第一波
			
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
 - electron入门心得
			
前言 前端开发桌面程序这个概念已经出现有一段时间了,这项技术也已经走向成熟,Github上nw和光electron的star就差不多有10w颗星了,github也衍生出了很多开源的桌面项目俨然成了一个 ...
 - 22.Linux-块设备驱动之框架详细分析(详解)
			
本节目的: 通过分析块设备驱动的框架,知道如何来写驱动 1.之前我们学的都是字符设备驱动,先来回忆一下 字符设备驱动: 当我们的应用层读写(read()/write())字符设备驱动时,是按字节/字符 ...
 - asp.net mvc 自动化测试工具
			
好久不写文章了,一直忙在项目中. 前一阵发现公司一个项目,体积巨大.业务很复杂.基于历史原因,项目基于mvc 2迁移过来,视图大多还是aspx 作为视图承载. 控制器中的方法 更是一个比一个多. ...
 - Python接口自动化——soap协议传参的类型是ns0类型的要创建工厂方法纪要
			
1:在Python接口自动化中,对于soap协议的xml的请求我们可以使用Suds Client来实现,其soap协议传参的类型基本上是有2种: 第一种是传参,不需要再创建啥, 第二种就是ns0类型的 ...