【leetcode】递归、字符串高频题目整理

124 阅读1分钟

递归

树形

  • 【105】从前序与中序遍历序列构造二叉树

一维

  • 【4】求两有序数组第k个数⭐

    • 每次排除k/2个数

    • func findK(nums1,nums2 []int,l1,l2,k int) int{
          if len(nums1)-l1 > len(nums2)-l2{
              return findK(nums2,nums1,l2,l1,k)
          }
          if len(nums1)==l1{
              return nums2[l2+k-1]
          }
          if k==1{
              return min(nums1[l1],nums2[l2])
          }
          
          m1,m2:=min(len(nums1),l1+k/2),l2+k/2
          if nums1[m1-1]<nums2[m2-1]{
              return findK(nums1,nums2,m1,l2,k-(m1-l1))
          }else{
              return findK(nums1,nums2,l1,m2,k-(m2-l2))
          }
      }
      
  • 【215】数组中的第K个最大元素:快排优化

  • 寻找两数组第k位数

归并

  • 归并排序
  • 【23】合并k个上升链表:归并+链表合并
  • 【offer 51】数组中的逆序对:归并过程中,num[i]>num[j],ans+=mid-i+1

字符串

  • 回文串问题:Manacher
  • 字符串匹配问题:KMP

字典序

从前向后依次比大小,如果长度不一样且包含:ab在abc之前

  • 【49】字母异位词分组:字典序排序+hash记录

  • 【179】最大数,将数组排列成字典序最大

    • 结果的字典序一定是a1>=a2>=a2...,反证法即可
    • sort.Slice(nums,func (i,j int)bool{
          s1,s2:=strconv.Itoa(nums[i]),strconv.Itoa(nums[j])
          return s1+s2>s2+s1
      })
      

KMP

【28】找出字符串中第一个匹配项的下标

Trie树

  • 【208】实现 Trie (前缀树):标准Trie