leetcode刷题总结1-50

1. 两数之和

  描述:nums = [2, 7, 11, 15], target = 9       返回[0, 1]

  思路:双指针,一个从前,一个从后。(数组必须排序)

2. 两数相加

  描述:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

  思路:通过最低位开始和进位(init:0)相加。时间复杂度O(max(m,n))

3. 无重复字符的最长字串

  描述:

    输入: "abcabcbb"
    输出: 3
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

  思路: 快指针和慢指针,hashmap结构<char,index>

4. 寻找两个正序数组的中位数。(放弃)

  描述:

    nums1 = [1, 2]
    nums2 = [3, 4]

    则中位数是 (2 + 3)/2 = 2.5

  思路:转换为找第i个小的数,分别找两个数组的i/2个小的数,比较边界,动态变换两个切点的位置。

5. 最长回文子串

  描述:

    输入: "babad"
    输出: "bab"
    注意: "aba" 也是一个有效答案。

  思路:动态规划。定义状态变量dp[i][j]为子串i~j是否为回文。dp[i][j]=dp[i+1][j-1] AND i==j?

6. Z字形变换

  描述:

    输入: s = "LEETCODEISHIRING", numRows = 4
    输出: "LDREOEIIECIHNTSG"
    解释:

      L           D         R
      E     O  E      I   I
      E C       I  H      N
      T          S          G

   思路: 定义numRows数组,来一个字符放入,(放入的时候按照一定规律)

7. 正数反转

  描述:123=>321    -123=> -321    120=>21

  思路: 通过相除取余10,不断计算累加。

8. 字符串转换整数

  描述: "42"->42    ;     "      -42"->"-42"  ;    "words and 987" => "" ;  "4193 with words"=>"4193"

  思路: 自动机判断即可

9. 回文数

  描述:

    输入: 121
    输出: true

  思路:转变为字符串比较;

10.正则表达式匹配

  描述: 一定规则的正则匹配

  思路: 动态规划

      

 

 

11. 装最多水的容器。

  描述:

    输入:[1,8,6,2,5,4,8,3,7]
    输出:49

    

 

 

   思路:双指针,一个开始,一个尾,开始计算靠紧。

12. 整数转罗马数字

  描述:

    输入: 1994
    输出: "MCMXCIV"
    解释: M = 1000, CM = 900, XC = 90, IV = 4.

  思路:不断与对应的罗马数字相减。存储映射关系。

13. 罗马数字转整数:

  描述:

    输入: "MCMXCIV"
    输出: 1994
    解释: M = 1000, CM = 900, XC = 90, IV = 4.

  思路:计算累加。注意V与VI

14. 最长公共前缀

  描述:

    输入: ["flower","flow","flight"]
    输出: "fl"

    输入: ["dog","racecar","car"]
    输出: ""

  思路:比较即可。

15 . 三数之和

  描述:  

    给定数组 nums = [-1, 0, 1, 2, -1, -4],  target=0

    满足要求的三元组集合为:
        [
          [-1, 0, 1],
          [-1, -1, 2]
        ]

  思路: 排序  +  先固定第一个指针,然后双指针从第二个位置和尾指针遍历。

16. 最接近的三数之和   

  类比  三数之和

17. 电话号码的字母组合

  描述:

    

    输入:"23"
    输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

 

   思路: 回溯+深度优先

18. 四数之和

  类比 三数之和   n^3

19. 删除链表的倒数第N个节点

  描述;

    给定一个链表: 1->2->3->4->5, 和 n = 2.

    当删除了倒数第二个节点后,链表变为 1->2->3->5.

  思路:时间复杂度)(n),设两个指针,都从头开始,第二个指针和第一个距离保持n的长度,当第二个为Null,证明已经到尾了,那么第一个就在被删除节点的前一个。

20. 有效的括号

  描述:

    输入: "()[]{}"
    输出: true

  思路: 栈

21. 合并两个有序链表

  描述:

    输入:1->2->4, 1->3->4
    输出:1->1->2->3->4->4

  思路:合并即可

22. 括号生成

  描述:  

    输入:n = 3
    输出:[
        "((()))",
        "(()())",
        "(())()",
        "()(())",
        "()()()"
      ]

  思路: 回溯

23 合并K个排序链表

  描述:

    输入:
      [
        1->4->5,
        1->3->4,
        2->6
      ]
    输出: 1->1->2->3->4->4->5->6

  思路:归并,每2个采用   “ 21. 合并两个有序链表”

24. 两两交换链表中的节点  

  描述:给定 1->2->3->4, 返回 2->1->4->3.

  思路:类比下一题

25. K个一组交换

  描述: 

    给你这个链表:1->2->3->4->5

    当 k = 2 时,应当返回: 2->1->4->3->5

    当 k = 3 时,应当返回: 3->2->1->4->5

  思路:

    采用3个指针,一个指head,一个慢慢往后走,另一个是第二个的后一个,逐渐往后修改。到K个后,修改head和end,即end为下一个递归的head

26. 删除排序数组中的重复项

  描述:

    给定数组 nums = [1,1,2],

    函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

  思路:快指针慢指针。

27. 移除元素

  描述:

    给定 nums = [3,2,2,3], val = 3,

    函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

  思路:快指针慢指针

28. 实现Strstr()

  描述:

    输入: haystack = "hello", needle = "ll"
    输出: 2

  思路:KMP (next数组)

29. 两数相除

  描述:

    输入: dividend = 10, divisor = 3
    输出: 3
    解释: 10/3 = truncate(3.33333..) = truncate(3) = 3

 

  思路:被除数翻倍,10能除过3,那么除6,否则再除12....当除不过的时候再去这个区间划分。

30. 串联所有单词的子串

  描述:

    输入:
      s = "barfoothefoobarman",
      words = ["foo","bar"]
    输出:[0,9]

  思路:先把words的单词和个数放入hashmap,然后通过s的窗口滑动完成搜。(窗口的长度与words字符个数相同,窗口也采用hashmap的统计方式)

31. 下一个排列:

  描述:

      1,2,3 → 1,3,2
      3,2,1 → 1,2,3
      1,1,5 → 1,5,1

  思路:从大到小排序;从后往前找突然变小的,然后交换此数字和后面比他大的最小的。然后将那个突然变小的后面倒序。(1576432)->将5和6交换(1675432)倒序75432->1623457

32. 最长有效括号:

  描述:

    输入: "(()"
    输出: 2
    解释: 最长有效括号子串为 "()"

  思路:栈

33. 搜索旋转排序数组

  描述:

    输入: nums = [4,5,6,7,0,1,2], target = 0
    输出: 4

  思路:二分查找。看那一半的两边是否递增。

34. 在排序数组中查找元素的第一个和最后一个位置

  描述:

    输入: nums = [5,7,7,8,8,10], target = 8
    输出: [3,4]

  思路: 二分

35. 搜索插入位置

  描述:

    输入: [1,3,5,6], 5
    输出: 2

  思路:二分

36. 有效的数独

  描述:

    数字 1-9 在每一行只能出现一次。
    数字 1-9 在每一列只能出现一次。
    数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

    

 

    输出: true

 

   思路: 从上到下,从左到右,三维数组(第一个是原数组的行,第二个是原数组的列,第三个是所属的Block,检测当前block是否已存在已存在的)

37. 解数独

  描述:

    数字 1-9 在每一行只能出现一次。
    数字 1-9 在每一列只能出现一次。
    数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

      

 

 

   思路: 回溯(现在[0][2]放1,然后从左往右,发现失败回溯)

38. 外观数组。。。。略

39. 组合总和

  描述:(允许重复)

    输入: candidates = [2,3,5], target = 8,
    所求解集为:
      [  
        [2,2,2,2],
        [2,3,3],
        [3,5]
      ]

   思路:回溯

40 .组合总和 II

  描述:(不允许重复)

    candidates = [2,5,2,1,2], target = 5,
    所求解集为:
    [
      [1,2,2],
      [5]
    ]

  思路:回溯

41. 缺失的第一个正数

  描述:

    输入: [3,4,-1,1]
    输出: 2

  思路:创立一个长度为n的数组,遍历一遍,将负数和0扔掉,若当前正数小于n,放在第i位,若大于n,也丢弃。那么这个数组从头到尾遍历即可。

42. 接雨水

  描述:

    

 

 

   思路:栈(当遇到比当前的相等或者高,那么就可以计算累加了)

43 . 字符串相乘

  描述:

    输入: num1 = "123", num2 = "456"
    输出: "56088

  思路:普通的乘法。(“3”-“0”=3)

44.通配符匹配

  描述:

    输入:
      s = "cb"
      p = "?a"
    输出: false

  思路: 通过回溯即可;动态规划,设定状态变量dp[i][j]字符串前i个与模式前j个是否匹配。

45. 跳跃游戏2

  描述:

    输入: [2,3,1,1,4]
    输出: 2
    解释: 跳到最后一个位置的最小跳跃数是 2。

  思路: 动态规划。初始第一个为2,那么将dp[1],dp[2]设为1.第二个为3,那么dp[2]=min(dp[2],dp[1]+1)

46. 全排列

  描述:

    输入: [1,2,3]
    输出:
      [
        [1,2,3],
        [1,3,2],
        [2,1,3],
        [2,3,1],
        [3,1,2],
        [3,2,1]
      ]

  思路:递归

47. 全排列 II

  描述:(允许输入的数组中有重复,但是保证输出不能有重复)

    输入: [1,1,2]
    输出:
      [
        [1,1,2],
        [1,2,1],
        [2,1,1]
      ]

  思路:回溯+剪枝

48. 图像旋转

  描述:

    输入

    [
      [1,2,3],
      [4,5,6],
      [7,8,9]
    ],

    输出

    [
      [7,4,1],
      [8,5,2],
      [9,6,3]
    ]

  思路:找规律,1,3,9,7进行变换,然后2,6,8,4...

49. 字母异位词分组

  描述:

    输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
    输出:
      [
        ["ate","eat","tea"],
        ["nat","tan"],
        ["bat"]
      ]

  思路: hashmap<sorted string,List<source string>>

50. pow(x,n)

  描述: x的n次方

  思路:不断进行n的除以2的操作,进行x*x或者x*x*y的递归操作

 

posted @ 2020-07-03 21:35  _Meditation  阅读(210)  评论(0编辑  收藏  举报