从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()
相关推荐
散峰而望4 分钟前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
CoderCodingNo14 分钟前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
我有一些感想……20 分钟前
An abstract way to solve Luogu P1001
c++·算法·ai·洛谷·mlp
郭涤生21 分钟前
第十章_信号_《UNIX环境高级编程(第三版)》_笔记
服务器·笔记·unix
前端小L21 分钟前
双指针专题(三):去重的艺术——「三数之和」
javascript·算法·双指针与滑动窗口
QT 小鲜肉32 分钟前
【Linux命令大全】001.文件管理之which命令(实操篇)
linux·运维·服务器·前端·chrome·笔记
小小星球之旅1 小时前
CompletableFuture学习
java·开发语言·学习
盐焗西兰花1 小时前
鸿蒙学习实战之路-ArkTS循环渲染_ForEach使用指南
学习·华为·harmonyos
巧克力味的桃子1 小时前
单链表 - 有序插入并输出学习笔记
笔记·学习
智者知已应修善业1 小时前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法