1 2sum map结构存储每个数的下标,每遍历一个nums[i],找出map中target-nums[i]对应的下标,即返回i和该下标。
2 Add Two Numbers两个链表表示两个倒序的整数,相加后得一整数并倒序形成链表。就是把两个链表从头结点开始相加,注意进位
3 Longest Substring Without Repeating Characters用vector初始化每个字符出现的位置为-1,如若重复字符出现则置为新位置并作为新子串的起始位置
4 Median of Two Sorted Arrays找到两合并排序数组中第中间个数或中间两个数的平均数。问题转化为两排序数组合并后的第k大数,若当前A数组元素小,PA++,m++,否则PB++,m++,直到m==k,复杂度O[n]。若要复杂度O[logn],要找到第k大,每次将A的第k/2和k/2比较,若A的k/2元素小于B的k/2元素,则删除A的前k/2所有元素,递归找新的合并数组的第k/2大元素。
5 Longest Palindromic Substring暴力解决法(判断每个子串是否回文o(n^2))动态规划(初始化p[i][i]和p[i][i+1],再外循环len=3到=lenghth,内循环起始位置i=0到=length-len,进入内循环结束位置j=i+len-1,判断P[i+1][j-1]&&s.at(i)==s.at(j),成立则start更新为i,maxlen=len,p[i][j]true)中心扩展法
6 zigzag conversion
7 reverse integer申明long r=0,x除余更新r,x/=10,若int(r)==r,返回r,否则溢出。
8 atoi处理前缀‘’ ‘+’ ‘-’最后判断输入在‘0’‘9’间,再判断num溢出(num > INT_MAX / 10 ||
(num == INT_MAX / 10 &&(str[i] - '0') > INT_MAX % 10))最后return num*sign
9 palindrome munber颠倒数字,相等就是回文数
10 regular expression matching
11 container with most water前后两指针,mx=max(mx,((j-i)*(min(height[i],height[j]))));
if(height[i]
12 integer to roman
13 roman to integer
14 longest common prefix遍历vector,每次记住前两个串的最长共同前缀,再与下一个串对比,更新最长前缀。
15 3sum先排序,遍历一遍,选一个nums[i],选定两个首尾指针,指向的数相加和target-nums[i]相比,小于则首指针++,大于则尾指针--。若要去重结果,要在nums[i]=nums[i+1]时i++,*front=triplet[1]时front++,*tail=triplet[2]时tail
++
16 3sums closet记住每次最小的closet,curSum大于target,则back--,否则front++
17 letter combination of a phonenumer遍历vector
18 4sum在3sum上基础上第一个循环后加了一个for循环
19 remove Nth node from End of List双指针,且第二指针只能走到第N-1处才能删除Nth Node
20 valid parentheses用栈实现括号成对。string left = "([{"; string right = ")]}";遍历string,若c是left中,则push,否则{先判断,栈为空或者栈顶元素不是c的左半边,则返回false;否则,pop()。}最后return 栈.empty();
21 merge two sorted Lists先初始化前缀头结点,注意一个链表已经到结尾的情况。
22 generate parentheses多对括号有效排列。递归
23 merge k sorted Lists调用每两个sorted Lists排序的函数k-1次
24 swap nodes in pairs定义前缀节点,并定义prev,cur,next三个ListNode*指针
25 reverse nodes in K-groups
链表反转
1.就地反转法
public ListNode reverseList1(ListNode head) {
if (head == null)
return head;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode prev = dummy.next;
ListNode pCur = prev.next;
while (pCur != null) {
prev.next = pCur.next;
pCur.next = dummy.next;
dummy.next = pCur;
pCur = prev.next;
}
return dummy.next;
}
ListNode* reverse(ListNode* first, ListNode* last)
{
ListNode* prev = last;
while ( first != last )
{
auto tmp = first->next;
first->next = prev;
prev = first;
first = tmp;
}
return prev;
}
每次反转k个节点
26 remove duplicates from sorted array
27 remove element
28 implement strStr()字符串匹配子串
29 divide two integers外循环每次从减一倍除数开始,内循环每次把处处翻倍,被除数不够了就跳出,再置除数为一倍。
30 Substring with concatenation of all words
31 Next permutation http://blog.csdn.net/qq575787460/article/details/41215475
1:从后向前比较相邻的两个元素,直到前一个元素小于后一个元素,停止
2:如果已经没有了前一个元素,则说明这个排列是递减的,所以这个排列是没有下一个排列的。
124653这个排列终止情况是上面介绍的第一种,从后向前比较相邻的2个元素,遇到4<6的情况停止。
并且我们可以知道:
1:124653和它的下一个排列的公共前缀为12(因为4653存在下一个排列,所以前面的数字12保持不变)
2:4后面的元素是递减的(上面介绍的终止条件是前一个元素小于后一个元素,这里是4<6)
现在,我们开始考虑如何找到4653的下个排列,首先明确4后面的几个数字中至少有一个大于4.
4肯定要和653这3个数字中大于4的数字中(6,5)的某一个进行交换。这里就是4要和6,5中的某一个交换,很明显要和5交换,如果找到这样的元素呢,因为我们知道4后面的元素是递减的,所以在653中从后面往前查找,找到第一个大于4的数字,这就是需要和4进行交换的数字。这里我们找到了5,交换之后得到的临时序列为5643.,交换后得到的643也是一个递减序列。
所以得到的4653的下一个临时序列为5643,但是既然前面数字变大了(4653--->5643),后面的自然要变为升序才行,变换5643得到5346.
所以124653的下一个序列为125643.
32 longest valid parentheses
33 search in rotated sorted array
34 search for a range二分查找,第一个索引从前往后,第二个索引从后往前
35 search insert position 二分查找
36 valid sudoku
37 sudoku solver
38 count and say
39 combination sum用递归,参数(vector
40 combination sum 2
41 first missing positive 桶排序
42 multiply strings
44 wildcard matching
45 jump game2
46 permutations
47 permutations 2
48 rotate image
49 group anagrams用map
50 pow(x,n)