从0开始学算法——第十四天(数组与搜索练习)

写在开头的话

学习了今天的基础知识,让我们来做道题来练练手吧。(题目是别的地方扒来的,参考答案是我自己写的,肯定不是最优解,有更好的方法欢迎评论区交流)

题目一------整数二分

第一题参考答案(Python版)

python 复制代码
import sys
import bisect

def main():
    data = sys.stdin.read().split()
    it = iter(data)
    n = int(next(it))
    q = int(next(it))
    A = [int(next(it)) for _ in range(n)]

    out_lines = []
    for _ in range(q):
        t = int(next(it))
        l = int(next(it))
        r = int(next(it))
        x = int(next(it))

        if t == 1:      # 等于 x 的最左边下标
            low = bisect.bisect_left(A, x) + 1   # 全局第一个 >= x 的下标(1‑based)
            pos = max(low, l)
            if pos <= r and A[pos-1] == x:
                out_lines.append(str(pos))
            else:
                out_lines.append("-1")

        elif t == 2:    # 等于 x 的最右边下标
            high = bisect.bisect_right(A, x) + 1  # 全局第一个 > x 的下标(1‑based)
            pos = min(high-1, r)
            if pos >= l and A[pos-1] == x:
                out_lines.append(str(pos))
            else:
                out_lines.append("-1")

        elif t == 3:    # 第一个 >= x 的下标
            low = bisect.bisect_left(A, x) + 1
            pos = max(low, l)
            if pos <= r:
                out_lines.append(str(pos))
            else:
                out_lines.append("-1")

        else:           # t == 4,第一个 > x 的下标
            high = bisect.bisect_right(A, x) + 1
            pos = max(high, l)
            if pos <= r:
                out_lines.append(str(pos))
            else:
                out_lines.append("-1")

    sys.stdout.write("\n".join(out_lines))

if __name__ == "__main__":
    main()
相关推荐
科研前沿几秒前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨1 分钟前
1931. 用三种不同颜色为网格涂色
算法·leetcode
北山有鸟16 分钟前
修改源码法和插件法
嵌入式硬件·学习
richxu2025100118 分钟前
嵌入式学习之路->stm32篇->(14)通用定时器(上)
stm32·单片机·嵌入式硬件·学习
晨曦夜月27 分钟前
map与unordered_map区别
算法·哈希算法
小陈phd31 分钟前
TensorRT 入门完全指南(一)——从核心定义到生态工具全解析
人工智能·笔记
是上好佳佳佳呀38 分钟前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记
qeen8741 分钟前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码1 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler011 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法