必知算法题总结

2021/05/02 Algorithms 共 4983 字,约 15 分钟

剑指offer

Leetcode剑指offer合集

先看Cyc2018

常遗忘梳理

leetcode hot200

Cyc2018

常遗忘梳理

leetcode blind 75

Array


Binary

  • Sum of Two Integers 不用+做加法,记得python的负数处理,要取负数的补码,需要&0xffffffff。 负数的补码还原到python的负数,如-2, 需要&下0xffffffff,然后取反加一,外面再加个负号。
  • Number of 1 Bits
  • Counting Bits 统计1-n里每个数字二进制的1的个数,动态规划,最低设置位。 res[i] = res[i & (i - 1)] + 1
  • Missing Number 异或
  • Reverse Bits 反转位,一个新值,不断从右边增加然后左移

Dynamic Programming


Graph


Interval

贪心的可以按end排序,否则涉及插入、合并的都是按start排序

秒懂力扣区间题目:重叠区间、合并区间、插入区间

找最多不重合的数量,按end排序

  • Insert Interval 按start排序,遇到重叠就合并,start = min(start, left), right= max(right, end)

  • Merge Intervals 合并区间,按start排序

  • Non-overlapping Intervals

  • Meeting Rooms (Leetcode Premium) Given an array of meeting time intervals consisting of start and end times[[s1,e1],[s2,e2],...](si< ei), determine if a person could attend all meetings.

    解答: 按start排序,看有无重合区间

  • Meeting Rooms II (Leetcode Premium) Given an array of meeting time intervals consisting of start and end times[[s1,e1],[s2,e2],...](si< ei), find the minimum number of conference rooms required.

    可以用heap弹出,复杂度高。最佳是扫描线算法。遇到start则+1, end则-1. 参考


Linked List


Matrix


String


Tree


Heap

14 Patterns to Ace Any Coding Interview Question

其他

  • bfs最小转弯路径
    • pop一个点,对4个方向都遍历到头,然后加进队列里,每次放队列时就设置visit
  • 442. 数组中重复的数据

    • 给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 最多两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
    • 数字交换到它的位置上,可以o(1)空间复杂度
          for i in range(n):
              while nums[i] - 1 != i and nums[nums[i] - 1] != nums[i]:
                  a, b = nums[i], nums[nums[i] - 1]
                  nums[nums[i] - 1], nums[i] = a, b
  • 42. 接雨水

    • 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
    • 一种是记录leftMax, rightMax。 另一种更优的是单调栈,pop时,栈下一个就是比它高的左边元素,即将入栈的是右边的高,计算这部分横着的体积,(i - left - 1) * (min(height[left], height[i]) - height[top])
  • 407. 接雨水 II
    • 给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。
    • 最小堆每次找最小高度的从外往里遍历。类似Dijstra。初始化时是所有边缘处入栈
  • 贪心算法。

    • 求最多需要跳几次,rightmost, end是上一次的rightmost,end变时加一。参考
  • 区间

    • 求最多无重复区间数量。结束最早的那个一定会被选中。435. 无重叠区间 . 贪心。先结束点排序。参考
        intervals.sort(key=lambda x: x[1])
        n = len(intervals)
        right = intervals[0][1]
        ans = 1

        for i in range(1, n):
            if intervals[i][0] >= right:
                ans += 1
                right = intervals[i][1]

Search

    Table of Contents