Question Bank

本贴最后更新于 624 天前,其中的信息可能已经事过境迁
  1. ⚙ Question Template1
  2. 📄 [975] 奇偶跳2
  3. 📄 [1155] 掷骰子等于目标和的方法数5
  4. 📄 [1726] 同积元组6
  5. 📄 [2530] 执行 K 次操作后的最大分数7


  1. Question Template

    [id] Question Name

    • address

      question address

    • tags

      ​#leetcode#​

    • solution explain

    • solution code

      • Python3

  2. [975] 奇偶跳

    • address

      [975] 奇偶跳

    • tags

      ​#leetcode#​ #alg/动态规划#​ ​#alg/单调栈#​

    • solution explain

      在给定的数组中,每个位置使用奇数跳跃或者偶数跳跃,落点都是可以唯一确定的。确定了在每个位点奇偶跳的落点,即可判断从每个点能否最终到达末尾。

      奇数跳,只不过是在后续大于等于自己的元素中找值最接近的位置;
      反之偶数跳,是在小于等于自己的元素中找最接近自己的元素。

      • 单调栈解法

        统计在 i​点的奇数跳落点时:

        将原始数组 A​的索引按位置的数值从小到大进行排序。即 B = sorted(range(N), key = lambda i: A[i])

        这样就可以知道每个位置与之数值最接近的值(A[B[1]]与之最接近的值是 A[B[2]]),但是不能这样这样粗暴认为 A[B[n+1]]就是 A[B[i]]的奇数跳落点坐标,因为 B[n+1]和 B[n]还必须满足 B[n+1] > B[n],即索引位置关系。

        因为 A[B[n]]这个数组已经是升序,于是我们就可以总结:“==在 B 数组中 B[n]之后首个大于 B[n]的值 B[m]即为 A[B[n]]的奇数跳落点 A 坐标 A[B[m]]==”(细细品~) 相当于在 B 数组中寻找递减序列

        使用一个单调栈即可实现,遍历 B,保证栈内元素由低至顶递减,当新元素 Y 大于栈顶元素时,弹出栈顶 X,即 A 数组中索引为 X 的点奇数跳落点索引为 Y,遍历完成后仍然在栈中的元素,表明在 A 数组中这些索引位置处无法进行奇数跳,落点记为 None。详见 Python3 - 单调栈1make

        偶数跳同理,只需将元素取负即可(小于等于并最接近自己的元素,取负后成为大于等于并最接近自己)。

      在奇偶数跳跃落点两个数组的基础上即可求出 DP 数组,dp[i][0]​表示能否从 i 处通过偶数跳最终到达终点,dp[i][1]​表示能否从 i 处通过奇数跳最终到达终点,且 dp[len-1][0] = dp[len-1][1] = 1​,从末尾往前推导即可完善整个 DP 数组,规则为:

      1. 如果 i 处能进行偶数跳(即 even[i] is not None),此处能否偶数跳最终最终到达终点取决于跳跃落点处能否通过奇数跳并最终到达终点(即 dp[i][0] = dp[even[i]][1]​)
      2. 奇数跳与上同理。

      因为起始跳跃为奇数跳,对 dp[][1]​进行求和即为题解。

      • TreeMap​解法

        单调栈解法1中我们所做的事情 TreeMap​提供了 API:lowerKey(v)​和 higherKey(v)​,即为略小于 v 的值,略大于 v 的值。

    • solution code

      • Python3 - 单调栈

        class Solution(object): def oddEvenJumps(self, A): N = len(A) def make(B): ans = [None] * N stack = [] # invariant: stack is decreasing for i in B: while stack and i > stack[-1]: ans[stack.pop()] = i stack.append(i) return ans B = sorted(range(N), key = lambda i: A[i]) oddnext = make(B) B.sort(key = lambda i: -A[i]) evennext = make(B) odd = [False] * N even = [False] * N odd[N-1] = even[N-1] = True for i in range(N-2, -1, -1): if oddnext[i] is not None: odd[i] = even[oddnext[i]] if evennext[i] is not None: even[i] = odd[evennext[i]] return sum(odd) 作者:LeetCode 链接:https://leetcode.cn/problems/odd-even-jump/solutions/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
      • Java - TreeMap 解法

        class Solution { public int oddEvenJumps(int[] A) { int N = A.length; if (N <= 1) return N; boolean[] odd = new boolean[N]; boolean[] even = new boolean[N]; odd[N-1] = even[N-1] = true; TreeMap<Integer, Integer> vals = new TreeMap(); vals.put(A[N-1], N-1); for (int i = N-2; i >= 0; --i) { int v = A[i]; if (vals.containsKey(v)) { odd[i] = even[vals.get(v)]; even[i] = odd[vals.get(v)]; } else { Integer lower = vals.lowerKey(v); Integer higher = vals.higherKey(v); if (lower != null) even[i] = odd[vals.get(lower)]; if (higher != null) { odd[i] = even[vals.get(higher)]; } } vals.put(v, i); } int ans = 0; for (boolean b: odd) if (b) ans++; return ans; } } 作者:LeetCode 链接:https://leetcode.cn/problems/odd-even-jump/solutions/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    • Python3 - 单调栈
    class Solution(object): def oddEvenJumps(self, A): N = len(A) def make(B): ans = [None] * N stack = [] # invariant: stack is decreasing for i in B: while stack and i > stack[-1]: ans[stack.pop()] = i stack.append(i) return ans B = sorted(range(N), key = lambda i: A[i]) oddnext = make(B) B.sort(key = lambda i: -A[i]) evennext = make(B) odd = [False] * N even = [False] * N odd[N-1] = even[N-1] = True for i in range(N-2, -1, -1): if oddnext[i] is not None: odd[i] = even[oddnext[i]] if evennext[i] is not None: even[i] = odd[evennext[i]] return sum(odd) 作者:LeetCode 链接:https://leetcode.cn/problems/odd-even-jump/solutions/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    • 单调栈解法

    统计在 i​点的奇数跳落点时:

    将原始数组 A​的索引按位置的数值从小到大进行排序。即 B = sorted(range(N), key = lambda i: A[i])

    这样就可以知道每个位置与之数值最接近的值(A[B[1]]与之最接近的值是 A[B[2]]),但是不能这样这样粗暴认为 A[B[n+1]]就是 A[B[i]]的奇数跳落点坐标,因为 B[n+1]和 B[n]还必须满足 B[n+1] > B[n],即索引位置关系。

    因为 A[B[n]]这个数组已经是升序,于是我们就可以总结:“==在 B 数组中 B[n]之后首个大于 B[n]的值 B[m]即为 A[B[n]]的奇数跳落点 A 坐标 A[B[m]]==”(细细品~) 相当于在 B 数组中寻找递减序列

    使用一个单调栈即可实现,遍历 B,保证栈内元素由低至顶递减,当新元素 Y 大于栈顶元素时,弹出栈顶 X,即 A 数组中索引为 X 的点奇数跳落点索引为 Y,遍历完成后仍然在栈中的元素,表明在 A 数组中这些索引位置处无法进行奇数跳,落点记为 None。详见 Python3 - 单调栈1make

    偶数跳同理,只需将元素取负即可(小于等于并最接近自己的元素,取负后成为大于等于并最接近自己)。

  3. [1155] 掷骰子等于目标和的方法数

    • address

      [1155] 掷骰子等于目标和的方法数

    • tags

      ​#leetcode#​ ​#alg/动态规划#​

    • solution explain

      🥰 很经典的动态规划题

      首先按题意 n​个 k​面骰子一共能产生k^n种结果,要从这些结果中筛选出结果为 target​的结果数量。

      k​可以视为常量,利用动态规划思想拆分问题:

      n 个骰子能组合出 target 的结果数量 = n-1 个骰子能组合出 target - 1 的结果数量(假设第 n 个骰子掷出点数为 1) + ... + n-1 个骰子能组合出 target - k 的结果数量(假设第 n 个骰子掷出点数为 k)

      这样转换公式就显而易见了:f(n, target) = \sum_{pick=1}^k f(n-1, target-pick)

      因为条件限制了 1 <= n,k <= 30​,则初始状态就是f(1, 1..target),当我们只有一个骰子时,所有小于等于**k**​的 target, 其结果都是 1,反之则为 0

      f(1, target) = \begin{cases} 1 &\text{if } target \leq k \\ 0 &\text{if } target \gt k\end{cases}

      这样从上直下,就可以推算出整个 dp 数组,dp[n][target] = f(n, target) 即为所求

    • solution code

      • Python3

        class Solution: def numRollsToTarget(self, n: int, k: int, target: int) -> int: dp = [[0] * (target + 1) for _ in range(n + 1)] for i in range(1, target + 1): if k >= i: dp[1][i] = 1 for cnt in range(2, n + 1): for sum in range(1, target + 1): for pick in range(1, k + 1): if sum > pick: dp[cnt][sum] += dp[cnt - 1][sum - pick] dp[cnt][sum] %= (10 ** 9 + 7) return dp[-1][-1]

        Tips: 在确定了 target 和 k 之后,可以通过大小关系对循环次数进行缩减,甚至可以对 dp 数组进行压缩,以优化空间占用和运行时间。

  4. [1726] 同积元组

    • address

      [1726] 同积元组

    • tags

      ​#leetcode#​ #alg/哈希表#​

    • solution explain

      在所给的数组中均为不同的正整数,任意 4 个符合要求的数字,通过排列组合即可形成 8 个元组。

      统计数组中所有的乘积(共 len(nums) * (len(nums) - 1)​个乘积),这些乘积结果中必然有相同的,那么即为一组题解。

      针对每一个乘积结果,统计数对个数,即可得出 a * b = c * d = product​的题解数:

      例如有`n`​个数对乘积均为`product`​,那么从`n`​个数对中任意取出两个即可组成一个题解,共有$C_n^2$种取法即$\frac{n(n - 1)}{2}$

      将题解个数 * 8 即为最终元组个数。

    • solution code

      • Python3

        class Solution: def tupleSameProduct(self, nums: List[int]) -> int: res = 0 productCount: dict = {} for i in range(len(nums)): for j in range(i + 1, len(nums)): product = nums[i] * nums[j] productCount[product] = productCount.get(product, 0) + 1 for _, cnt in productCount.items(): res += int((cnt * (cnt - 1)) / 2) return res * 8

  5. [2530] 执行 K 次操作后的最大分数

    • address

      [2530] 执行 K 次操作后的最大分数

    • tags

      ​#leetcode#​​​ #alg/堆(优先队列)#​​​ #alg/贪心#​​​

    • solution explain

      看到“最”即联想贪心算法,每次都从待选列表(nums​)中取出最大的元素即为目标实现。

      Q: 每次元素变化后如何快速从其中找到最值元素?

      A: 大/小根堆(优先队列)

    • solution code

      • Python3

        from heapq import heapify, heappush, heappop class Solution: def maxKelements(self, nums: List[int], k: int) -> int: nums = [-num for num in nums] heapify(nums) res: int = 0 for _ in range(k): top = heappop(nums) res += -top heappush(nums, -((-top + 2) // 3)) return res

        Python 中 heapify​​默认小根堆,通过对元素进行取反实现所需的“大根堆”,每次取出堆顶值 top​​,然后进行 (-top+2) // 3​​【等效 ceil(top / 3)​​】,将结果取负后重新 push 进堆中。

      • Java

        使用 PriorityQueue​作为堆的替代实现

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 1 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 828 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 1 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 10 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖 • 2 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 818 回帖 • 1 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    61 引用 • 29 回帖 • 10 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 2 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 825 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 111 关注
  • danl
    179 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 39 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 246 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    100 引用 • 905 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 543 回帖 • 2 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖 • 1 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 3 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 486 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    326 引用 • 1395 回帖
  • Excel
    31 引用 • 28 回帖
  • 笔记

    好记性不如烂笔头。

    311 引用 • 794 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 1 关注