【面试题】找到 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++

相关文章
|
4月前
|
机器学习/深度学习 算法 测试技术
【图论】【广度优先】【 并集查找】2092 找出知晓秘密的所有专家
【图论】【广度优先】【 并集查找】2092 找出知晓秘密的所有专家
|
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
|
10月前
|
算法
代码随想录算法训练营第二十五天 | LeetCode 216. 组合总和 III、17. 电话号码的字母组合
代码随想录算法训练营第二十五天 | LeetCode 216. 组合总和 III、17. 电话号码的字母组合
47 0
初学算法之递归---放苹果
初学算法之递归---放苹果
|
算法
(dfs)A -暴力模个拟(我是第一吗?我好像是第一个捏~)(原题目为Serval 的元素周期表)
(dfs)A -暴力模个拟(我是第一吗?我好像是第一个捏~)(原题目为Serval 的元素周期表)
52 0
为什么QQ能帮你找到失散多年的兄弟?----图论
为什么QQ能帮你找到失散多年的兄弟?----图论
为什么QQ能帮你找到失散多年的兄弟?----图论
递归题目练习---薯队长
递归题目练习---薯队长
68 0
递归题目练习---薯队长