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

相关文章
|
8月前
|
算法 测试技术
进制算法题(进制转换、Alice和Bob的爱恨情仇)
进制算法题(进制转换、Alice和Bob的爱恨情仇)
|
8月前
|
机器学习/深度学习 算法 测试技术
【图论】【广度优先】【 并集查找】2092 找出知晓秘密的所有专家
【图论】【广度优先】【 并集查找】2092 找出知晓秘密的所有专家
|
7月前
|
C++
【洛谷 P1059】[NOIP2006 普及组] 明明的随机数 题解(集合)
**NOIP2006普及组题目**,明明需生成不重复的1-1000间随机整数,输入含两行:第一行是整数N(≤100),第二行是N个随机数。输出两行,第一行是唯一数的个数M,第二行是排序后的唯一数。示例:输入10个数含重复,输出8个不同数排序后结果。解题方法:利用C++的`set`进行去重和排序。
73 0
|
7月前
|
存储
【洛谷 P2141】[NOIP2014 普及组] 珠心算测验 题解(集合+多重循环)
**NOIP2014普及组的珠心算测验题要求参赛者找出给定集合中多少个数可表示为其他两个不同数的和。输入含n个正整数,输出满足条件的数的个数。样例输入4个数,输出2,因1+2=3且1+3=4。代码利用集合存储和,遍历所有数对组合,当找到匹配和时插入集合,最后输出集合大小。注意数据规模为n≤100,数不超过10,000。**
146 0
|
人工智能 算法 BI
C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑
C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑
|
C语言
C语言程序设计(王立柱)第三章答案 指针和数组
只有聪明人才能看见的摘要~( ̄▽ ̄~)~
98 0
|
设计模式 Java 编译器
这5个集合方面的问题,你都能答对吗?
这5个集合方面的问题,你都能答对吗?
这5个集合方面的问题,你都能答对吗?
|
算法
(dfs)A -暴力模个拟(我是第一吗?我好像是第一个捏~)(原题目为Serval 的元素周期表)
(dfs)A -暴力模个拟(我是第一吗?我好像是第一个捏~)(原题目为Serval 的元素周期表)
63 0
为什么QQ能帮你找到失散多年的兄弟?----图论
为什么QQ能帮你找到失散多年的兄弟?----图论
为什么QQ能帮你找到失散多年的兄弟?----图论
递归题目练习---薯队长
递归题目练习---薯队长
78 0
递归题目练习---薯队长