# leetcode个人刷题笔记（持续更新）

### 1. Two Sum

Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:

Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]

/*这题基本上没有什么难度，两个for一套解决问题*/
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> vec_result;

for(int i=0;i<nums.size();++i)
{
for(int j=i+1;j<nums.size();++j)
{
if(nums[i]+nums[j] == target)
{
vec_result.push_back(i);
vec_result.push_back(j);
}
}
}
return vec_result;
}
};

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

//其实我在练习递归。解释我放在代码中
/**
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
bool g_bCarry=false;
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int nValue1=0,nValue2=0;
if(g_bCarry && !l1&&!l2)//进位并且到达末端
{
ListNode* pNode=new ListNode(1);
g_bCarry=false;
return pNode;
}
if(!l1 && !l2)
{
g_bCarry=false;
return NULL;
}
if(l1)
nValue1=l1->val;
if(l2)
nValue2=l2->val;
if(g_bCarry)
nValue1+=1;
if(nValue1+nValue2 >= 10)
g_bCarry=true;
else
g_bCarry=false;

ListNode* pNode=new ListNode((nValue1+nValue2)%10);
ListNode* pNext=NULL;
if(l1 && l2)
else if(!l1 && l2)
else if(l1 && !l2)
else
pNode->next=pNext;
return pNode;
}
};

### 3. Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters.
Examples:

Given “abcabbb”, the answer is “abc”, which the length is 3.
Given “bbbbb”, the answer is “b”, with the length of 1.
Given “pwwkew”, the answer is “wke”, with the length of 3. >Note that the answer must be a substring, “pwke” is a subsequence and not a substring.

这个题我竟然没有理解到意思！

### 4. Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Example 1:

nums1 = [1, 3]
nums2 = [2]
The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5

//stl就是好，好的不得了，直接把nums2的添加到num1去，然后再使用sort来排序，再在num1找出来就好了！
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
double result;
for_each(nums2.begin(),nums2.end(),[&](int value){
nums1.push_back(value);
});
sort(nums1.begin(),nums1.end(),greater<int>());
if(nums1.size()%2==0)
{

return ((double)nums1[nums1.size()/2-1]+nums1[nums1.size()/2])/2;
}
else
{
return nums1[nums1.size()/2];
}
}
};

### 5. Longest Palindromic Substring

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Output: “bab”

Note: “aba” is also a valid answer.

Example:

Input: “cbbd”
Output: “bb”

/*遍历字符串，s[index - 1] == s[index + 1]用于判断这种情况 aabaa，
s[index-1] == s[index]用于判断 acbbca即重复的bb开始。
*/
class Solution {
public:
string longestPalindrome(string s)
{
string strResult;
string strTemp,strTemp2;
bool bMatchFinished = false;
if (s.length() <= 2) return s;
for (int index = 1; index<s.length(); ++index)
{
if (s[index - 1] == s[index + 1])
{
strTemp = "";
bMatchFinished=false;
for (int nPos = 0; nPos < index; ++nPos)
{
bMatchFinished = true;
if (s[index  -1- nPos] != s[index +1 + nPos]) break;
else strTemp += s[index -1- nPos];
}
if (bMatchFinished)
{
strTemp2 = strTemp;
reverse(strTemp2.begin(), strTemp2.end());
strTemp2 += s[index];
strTemp.insert(0,strTemp2);
}
if (strTemp.length() > strResult.length())
strResult = strTemp;
}
if (s[index-1] == s[index])
{
strTemp = "";
bMatchFinished=false;
for (int nPos = 0; nPos<index; ++nPos)
{
bMatchFinished = true;
if (s[index-1 - nPos] != s[index + nPos]) break;
else strTemp += s[index + nPos];
}
if (bMatchFinished)
{
strTemp2= strTemp;
reverse(strTemp2.begin(), strTemp2.end());
strTemp.insert(0,strTemp2);
}
if (strTemp.length() > strResult.length())
strResult = strTemp;
}
}
if (strResult.empty())
{
strResult= s[0];
return strResult;
}
return strResult;
}
};

### 6. ZigZag Conversion

The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P A H N
A P L S I I G
Y I R

And then read line by line: “PAHNAPLSIIGYIR”

Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);

convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.

/*原理是通过计算获取到底部的序号和最上部的序号，即可以获取周围的信息了
*/
class Solution {
public:
string convert(string s, int numRows)
{
if (s.length() <= 1 || 1 == numRows) return s;
vector<string> vec_str(numRows);
int i = 0;
for (int nPos = 0; nPos < s.length();++nPos)
{
int nBValue= (2*i+1)*(numRows-1);
int nTValue= 2*i*(numRows-1);
if (nPos == nBValue)
++i;
vec_str[abs(nTValue - nPos)] += s[nPos];
}
for (i = 1; i < numRows; ++i)
vec_str[0] += vec_str[i];
return vec_str[0];
}
};

### 7. Reverse Integer

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

/*本道题比较精巧，花费了一点脑筋，先取余，再除10，如此循环即可得到最后一位，循环的同时还要再将余乘10，连续如此，即得到结果，还有一个重要的问题，要判断有无溢出，采用的方法是使用long来存结果，long与INT_MAX，INT_MIN来判断*/
class Solution {
public:
int reverse(int x)
{
long nTotal =0;
while (x)
{
nTotal = nTotal * 10 + x % 10;
x /= 10;
}
return (nTotal > INT_MAX||nTotal < INT_MIN)? 0:nTotal;
}
};

### 8. String to Integer (atoi)

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

/*这个题直接举出遍历的各种情况就可以解决了,

int myAtoi(char* str)
{
long long nResult = 0;
bool bNegative = false;
for (;*str != '\0';str++)
{
if (*str == ' ')
continue;
if ((*str == '+' || *str == '-') && ('0' <= *(str + 1) && *(str + 1) <= '9'))
bNegative= (*str == '+' )? false:true;
if ((*str == '+' || *str == '-') && (*(str + 1) > '9' || *(str + 1) < '0'))
return 0;
if (('0' > *str || *str > '9') && *str != '+' && *str != '-')//不是数字,不是‘+’
return 0;
if ('0' <= *str && *str <= '9')
{
nResult *= 10;//先自*10,再加上该数字就好！
nResult += (*str - '0');
if (nResult>INT_MAX)
{
nResult = INT_MAX;
if(bNegative)
nResult=INT_MIN;
return nResult;
}
if(('0' > *(str + 1) || *(str + 1)> '9'))
break;
}
}
if (bNegative)
nResult = -nResult;
return nResult;
}

#### 9. Palindrome Number

Determine whether an integer is a palindrome. Do this without extra space.

/*共同的原理就是把这个数倒过来再来进过比对，如果两者的值相等就是一个回文，

//方法1：
bool isPalindrome(int x) {
int nTotal =0;
int nValue=x;
while (nValue>0)
{
nTotal = nTotal * 10 + nValue% 10;
nValue /= 10;
}
return nTotal == x;
}

bool isPalindrome(int x) {
if (x < 0)
return false;
string str=to_string(x);
string strTemp(str.rbegin(),str.rend());
return str==strTemp;
}

### 10.Regular Expression Matching

Implement regular expression matching with support for ‘.’ and ‘*’.

‘.’ Matches any single character.
‘*’ Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:

isMatch(“aa”,”a”) → false
isMatch(“aa”,”aa”) → true
isMatch(“aaa”,”aa”) → false
isMatch(“aa”, “a*”) → true
isMatch(“aa”, “.*”) → true
isMatch(“ab”, “.*”) → true
isMatch(“aab”, “c*a*b”) → true

/*这个题比较难，难在情况多，较复杂，解决方法可以使用递归，也可以使用动态规划，动态规划这个要学习一下*/
bool isMatch(char* s, char* p) {

}

### 11. Container With Most Water

Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container and n is at least 2.

解法1：
/*这个题比较坑爹，但也算是一种思维的锻炼，解法1直接两个for，理论可行，但效率不高，慢的不要不要的*/
int maxArea(vector<int>& height)
{
int nMax = 0;
for (int i = 0; i<height.size(); ++i)
for (int j = i + 1; j<height.size(); ++j)
{
int nTemp = max(height[i], height[j])*abs(j - i+1);
if (nTemp>nMax)
nMax = nTe
}
return nMax;
}

/*这个题也是看网友的，没想到这么巧妙解决了
left和right都向中央移动，每次移动left和Right中间高度较小的（因为反正都是移动一次，宽度肯定缩小1，这时候只能指望高度增加来增加容量，肯定是替换掉高度较小的，才有可能找到更大的容量。）

*/
int maxArea(vector<int>& height)
{
int nL = 0;
int nR = height.size() - 1;
int nMax = 0;
while(nL < nR)
{
int nTemp = (nR - nL)*min(height[nL], height[nR]);
if (nTemp > nMax)
nMax = nTemp;
height[nL] > height[nR]? nR-- : nL++;
}
return nMax;
}

### 12. Integer to Roman

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

/*类似于一个map映射对应的罗马字符，还是老方法先除即获取了多少个该数字，再取余即对该数字剩下的余数再来*/
string intToRoman(int num)
{
int n[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
char* r[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };

string strResult;
int nTemp=num,nTemp2 = 0;
for (int i = 0; i < 13; ++i)
{
nTemp2 = nTemp / n[i];//控制循环次数
while (nTemp2 > 0)
{
strResult += r[i];//添加进去
--nTemp2;//控制退出
}
nTemp=nTemp%n[i];//取余，对每一项
}
return strResult;
}

### 13. Roman to Integer

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

/*

*/
int romanToInt(string s) {
int n[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
char* r[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
int nResult=0;
for(int nPos=0 ;nPos<s.size(); ++nPos)
for(int j=0;j<13;++j)
{
if(strcmp(r[j],s.substr(nPos,2).c_str())==0)
{
nPos+=1;
nResult+=n[j];
break;
}
else if(strcmp(r[j],s.substr(nPos,1).c_str())==0)
{
nResult+=n[j];
break;
}
}
return nResult;
}

### 14. Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of strings.

/*这道题比较简单，求数组内字符串的公共最长前缀，

string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0) return "";
int nComLen=0;
for(int nPos=0;nPos<strs[0].size();++nPos)
{
int nTemp=1;
for( int j=1;j<strs.size();++j)
if(strs[j][nPos] == strs[0][nPos])
++nTemp;
else
break ;
if(nTemp==strs.size())
++nComLen;
else
break;
}
return strs[0].substr(0,nComLen);

}


### 15. 3Sum

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note: The solution set must not contain duplicate triplets.

For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]

vector<vector<int>> threeSum(vector<int>& nums) {

}

### 16. 3Sum Closest

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

### 17. Letter Combinations of a Phone Number

Given a digit string, return all possible letter combinations that the number could represent.

Input:Digit string “23”
Output: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].

A mapping of digit to letters (just like on the telephone buttons) is given below.

Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.

 vector<string> letterCombinations(string digits) {
char *pAry[] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
vector<string> vec_result,vec_temp;
string strTemp;
for (int i = 0;i<digits.size(); ++i)
{
int nNum = digits[i] - '0';//第几个，与前面所有的遍历
vec_temp.clear();
for (int j = 0; j < strlen(pAry[nNum]); ++j)
{
if (vec_result.size() == 0)
{
strTemp="";
strTemp += pAry[nNum][j];
vec_temp.push_back(strTemp);
}
for (int k = 0; k<vec_result.size(); ++k)
{
strTemp = "";
strTemp += vec_result[k];
strTemp += pAry[nNum][j];
vec_temp.push_back(strTemp);
}
}
vec_result = vec_temp;
}
return vec_result;
}