题目解析16 35 | 豆包MarsCode AI刷题

79 阅读3分钟

题目1:最大矩形面积

题目描述:

对于一个有 N 个元素的数组,包含如下的元素 h1, h2, ..., hn,对于 k 个相邻的元素,我们定义它的最大面积如下:
R(k)=k∗min(h[i],h[i+1],....,h[i+k−1])

求 R(k) 的最大值。

输入格式

总共有两行,第一行是数组长度 N,第二个是空格分割的所有数组的内容

输出格式

输出 R(k) 的最大值

输入样例

5
1 2 3 4 5

输出样例

9

数据范围

  • 1 <= N <= 10^5
  • 1 <= h[i] <= 10^6

解题思路:

  1. 滑动窗口:使用滑动窗口的方法遍历所有可能的子数组。
  2. 最小值的维护:在滑动窗口的过程中,维护当前窗口内的最小值。
  3. 更新最小值:在滑动窗口的过程中,考虑新加入的元素和移除的元素对最小值的影响。

题目2:小S的倒排索引

问题描述

小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小S决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,且ID按从小到大的顺序排列。
例如,单词“夏天”可能出现在帖子1、帖子3和帖子7中,那么这个单词的倒排链就是 [1, 3, 7]。如果用户想同时找到包含“夏天”和“海滩”的帖子,小S需要找出两个倒排链的交集,且将结果按照从大到小的顺序输出。现在,给定两个单词的倒排链数组 a 和 b,请你帮助小S找出同时包含这两个单词的帖子ID,并按从大到小的顺序返回结果。

测试样例

样例1:

输入:a = [1, 2, 3, 7], b = [2, 5, 7]
输出:[7, 2]

样例2:

输入:a = [1, 4, 8, 10], b = [2, 4, 8, 10]
输出:[10, 8, 4]

样例3:

输入:a = [3, 5, 9], b = [1, 4, 6]
输出:[]

样例4:

输入:a = [1, 2, 3], b = [1, 2, 3]
输出:[3, 2, 1]

算法步骤

  1. 初始化

    • 初始化两个指针 i 和 j,分别指向数组 a 和 b 的开头。
    • 初始化一个空的结果数组 result,用于存储交集元素。
  2. 遍历数组

    • 使用一个 while 循环,条件是 i 小于 a 的长度且 j 小于 b 的长度。

    • 在循环中,比较当前指针 i 和 j 指向的元素:

      • 如果 a[i] == b[j],则将该元素加入结果集 result,并同时移动两个指针 i 和 j
      • 如果 a[i] < b[j],则移动指针 i,因为当前 a[i] 不可能在 b 中找到匹配。
      • 如果 a[i] > b[j],则移动指针 j,因为当前 b[j] 不可能在 a 中找到匹配。
  3. 反转结果集

    • 由于题目要求结果按从大到小的顺序返回,因此在找到所有交集元素后,使用 reverse 函数将结果集 result 反转。

总结

  • 双指针法:通过两个指针分别遍历两个有序数组,找到交集元素。
  • 结果集反转:使用 reverse 函数将结果集反转,以满足题目要求的从大到小的顺序。