蓝桥杯算法训练 ALGO-1 区间k大数查询 Python

区间k大数查询 Python实现

要求

第一行包含一个数n,表示序列长度
第二行包含n个正整数,表示给定的序列。
第三个包含一个正整数m,表示询问个数。
接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。

分析

这道题的意思就是首先输入一串数字,然后再输入查询次数,每次查询会给定三个数,从左到右是[起始,结束,第几大的数]

代码实现
n = input() # 对于python是无用输入
l_ = list(input().split()) # 将数字串列表
query = [] # 用于存查询用的三个数
query_n = int(input()) # 查询次数

for i in range(query_n):
    query = input().split()
    temp = []
    for j in range(int(query[0])-1,int(query[1])):
        temp.append(int(l_[j])) # 切片取出对应序列内的数
#     print(temp)
    for k in range(len(temp)-1,-1,-1): # 冒泡排序
        for l in range(k):
            if temp[l] > temp[l+1]:
                temp[l],temp[l+1]=temp[l+1],temp[l]
#             print(temp)
#     print(temp)
    print(temp[-int(query[2])]) # 输出第几大的数

但是,这种方法虽然在逻辑上没有问题,但是在提交之后只通过了前三次,后七次全都超时 ,可知该方法在数字过多的时候时间过长。

改进代码
n = input()
l_ = list(map(int, input().split()))
query_n = int(input())
query = []
for i in range(query_n):
    query = list(map(int,input().split()))
#     print(query)
    l = int(query[0]) - 1
    r = int(query[1])
    k = int(query[2]) - 1
    temp = sorted(l_[l:r], reverse=True)
    print(temp[k])

其实可以直接利用python的sorted函数即可实现,并且速度快,通过测试。

总结

靠暴力破解其实还是局限太多,目前还是技术太差,多刷题,希望能有个好成绩把,以上!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值