【面试题】找到 Alice 和 Bob 可以相遇的建筑

简介: 【面试题】找到 Alice 和 Bob 可以相遇的建筑

找到 Alice 和 Bob 可以相遇的建筑**

仅供学习

题目描述

一、第一版结果

可以找到结果,但是不能保证每次查找都是最左边位置


1.1 解题思路

使用动态规划来处理建筑的最远到达位置,并在此基础上处理查询。

1.2 优化方法

  • 计算每个建筑能到达的最远建筑
  • 使用动态规划来计算从每个建筑能到达的最远建筑。
  • 处理查询:
  • 对于每个查询,找出 Alice 和 Bob 的可到达范围的交集,并返回最左边的建筑。

1.3 实现步骤

  • 计算每个建筑的最远到达建筑
  • 使用 dp 数组来存储从每个建筑能够到达的最远建筑。
  • 处理查询:
  • 对于每个查询,检查 Alice 和 Bob 是否可以相遇,并返回最小的符合条件的建筑索引。


1.4 示例代码

以下是优化后的 Python 代码实现

def find_building(heights, queries):
    n = len(heights)

    # 动态规划计算每个建筑的最远到达建筑
    farthest = list(range(n))

    for i in range(n):
        j = i + 1
        while j < n:
            if heights[j] > heights[i]:
                farthest[i] = j
            j += 1

    results = []

    # 处理每个查询
    for ai, bi in queries:
        if ai >= n or bi >= n:
            results.append(-1)
            continue

        # 找到 Alice 能到达的范围
        max_reach_alice = farthest[ai]
        for in_n in farthest[ai:]:

            if n < in_n or bi < in_n:
                break
            max_reach_alice = in_n
        print(ai, bi, max_reach_alice)
        # 找到 Bob 能到达的范围
        max_reach_bob = farthest[bi]
        for in_n in farthest[bi:]:

            if n < in_n or ai < in_n:
                break
            max_reach_bob = in_n
        print(ai, bi, max_reach_bob)

        # 判断是否可以相遇
        if max_reach_alice >= bi and max_reach_bob >= ai:
            results.append(min(max_reach_alice, max_reach_bob))
        else:
            results.append(-1)

    return results

1.5 代码解释

  • 计算最远到达建筑
  • 使用动态规划(farthest 数组)来存储从每个建筑能够到达的最远建筑。
  • 处理查询
  • 对于每个查询,找到 Alice 和 Bob 能够相遇的最右边建筑。

c++代码

找到 Alice 和 Bob 可以相遇的建筑,C++

相关文章
|
1月前
|
ice Python
答应我以后不要再用print打印了,冰淇淋来了!
答应我以后不要再用print打印了,冰淇淋来了!
43 1
|
4月前
|
算法
【错题集-编程题】小红的ABC(字符串 + 找规律)
【错题集-编程题】小红的ABC(字符串 + 找规律)
|
9月前
|
人工智能 算法 BI
C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑
C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑
|
4月前
leetcode-2115:从给定原材料中找到所有可以做出的菜
leetcode-2115:从给定原材料中找到所有可以做出的菜
37 0
|
9月前
|
C语言
第十四弹--打印1-100之间的素数
第十四弹--打印1-100之间的素数
Python|Leetcode《846》《1296》|一手顺子 划分数组为连续数字的集合
Python|Leetcode《846》《1296》|一手顺子 划分数组为连续数字的集合
|
算法
(dfs)A -暴力模个拟(我是第一吗?我好像是第一个捏~)(原题目为Serval 的元素周期表)
(dfs)A -暴力模个拟(我是第一吗?我好像是第一个捏~)(原题目为Serval 的元素周期表)
52 0
|
Java
《LeetCode刷题》—448. 找到所有数组中消失的数字
《LeetCode刷题》—448. 找到所有数组中消失的数字
108 0
《LeetCode刷题》—448. 找到所有数组中消失的数字
|
存储 算法 C语言
想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~
想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~
138 0
想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~
|
算法 数据处理 索引
LeetCode 448. 找到所有数组中消失的数字 | 算法-从菜鸟开始
算法,从承认自己是一个菜鸟开始! 话不多说,让我们继续我们的算法之旅。
107 0