当前位置: 首页 > article >正文

Luogu P2249 【深基13.例1】查找 --- python 3解法

P2249 【深基13.例1】查找 - 洛谷

由于数据很大,建议使用sys模块加速读取

方法一:标准做法

import sys

def find_first(numbers, target):

    len_ = len(numbers)
    left = 0
    right = len_ - 1

    while left < right:
        mid = left + (right - left) // 2 # 防止溢出

        if numbers[mid] >= target:
            right = mid
        else:
            left = mid + 1
            
    # **检查是否找到目标**
    if left < len(numbers) and numbers[left] == target:
        return left + 1  # 从1开始编号
    else:
        return -1  # 目标不存在,返回 -1

def search_targets(numbers, ref):
    return [find_first(numbers, i) for i in ref] 

n, m =  map(int, sys.stdin.readline().split())
numbers = list(map(int, sys.stdin.readline().split()))
ref = list(map(int, sys.stdin.readline().split()))

print(' '.join(map(str,search_targets(numbers, ref))))

方法二:res[] -- 剪枝思想 -- 适用于查找重复元素

import sys

def find_first(numbers, target, res):
    # 如果已经计算过这个目标,直接从res取结果
    if target in res:
        return res[target]
    
    len_ = len(numbers)
    left = 0
    right = len_ - 1

    while left < right:
        mid = left + (right - left) // 2  # 防止溢出

        if numbers[mid] >= target:
            right = mid
        else:
            left = mid + 1

    # 检查是否找到目标
    if left < len(numbers) and numbers[left] == target:
        res[target] = left + 1  # 从1开始编号
        return res[target]
    else:
        res[target] = -1  # 目标不存在,返回 -1
        return -1

def search_targets(numbers, ref):
    res = {}  # 使用字典来存储已经查找过的目标元素的索引
    return [find_first(numbers, i, res) for i in ref]

# 读取输入
n, m = map(int, sys.stdin.readline().split())
numbers = list(map(int, sys.stdin.readline().split()))
ref = list(map(int, sys.stdin.readline().split()))

# 输出结果
print(' '.join(map(str, search_targets(numbers, ref))))


http://www.kler.cn/a/598511.html

相关文章:

  • Agent toolkits集成指南
  • 【MyDB】一个仿照MySQL的轮子项目系列文章汇总
  • 算法如何测试,如果数据量很大怎么办?
  • 缓存设计模式
  • 论文阅读笔记:Denoising Diffusion Probabilistic Models (3)
  • NWAFU 生物统计实验二 R语言版
  • 逆波兰表达式
  • 基于Vue.js的组件化开发技术与实践探索
  • 数据通信学习笔记之OSPF其他内容1
  • WX小程序
  • Cocos Creator Shader入门实战(五):材质的了解、使用和动态构建
  • C++和标准库速成(十二)——练习
  • Flutter Dart 泛型详解
  • MATLAB+Arduino控制小车直行+转向
  • JVM(基础篇)
  • 深入解析大文件切片上传:Vue3 实现全流程指南
  • 低配电脑畅玩《怪物猎人:荒野》,ToDesk云电脑优化从30帧到144帧?
  • 多无人车协同探索开源包启动文件介绍(下)
  • MyBatis 学习经验分享
  • 使用LLama-Factory的简易教程(Llama3微调案例+详细步骤)