区间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函数即可实现,并且速度快,通过测试。
总结
靠暴力破解其实还是局限太多,目前还是技术太差,多刷题,希望能有个好成绩把,以上!