leedcode前50道题总结

1 2sum map结构存储每个数的下标,每遍历一个nums[i],找出map中target-nums[i]对应的下标,即返回i和该下标。

2 Add Two Numbers两个链表表示两个倒序的整数,相加后得一整数并倒序形成链表。就是把两个链表从头结点开始相加,注意进位

 Longest Substring Without Repeating Characters用vector初始化每个字符出现的位置为-1,如若重复字符出现则置为新位置并作为新子串的起始位置

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大元素。

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]=height[j]) j--;

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 nums,定义vecrot s是第一个int对应的字母比如2对应“a”“b”“c”然后每遍历一个nums[i],将nums[i]对应的每个字母拼接到s中每个串的后面形成新的s。

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& nums, vector& path, vector > &result,int gap, int start)

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>将同一个串的不同排列压入map中,比如“bac”“cba”“abc”,map[sort(s.begin(),s.end()].push_back(s);

50 pow(x,n)







你可能感兴趣的:(leedcode前50道题总结)