1、问题描述
2、样例输入输出
3
5 75 25
100
2 3
3、解题思路
- f i r s t − > first-> first−> 想到的就是利用双重循环进行暴力求解。过程大致是利用第一个元素与剩余元素进行匹配。然后再利用第二个元素与除了第一个元素外的剩余元素进行匹配,以此类推,直至全部匹配完毕。时间复杂度大概是 ( 1 + n ) × n 2 \frac{(1 + n) \times n}{2} 2(1+n)×n ,约有 x 2 2 \frac{x^2}{2} 2x2 这么多。
-
s
e
c
o
n
d
−
>
second->
second−> 先将处理的数据绑定下标,之后利用
s
o
r
t
e
d
(
)
sorted()
sorted() 方法
据说底层是TIM排序,感兴趣的同学可以去搜索一下
将数据排序,之后利用二分的原理设定左右指针,并将其初始化为0和end。如果两个指针指向的元素之和大于给定数字则右指针减一,相反就左指针加一,直到找到最终的数字之和。时间复杂度大概是排序加查找吧,约为 ( n × log 2 n ) + l o g 2 n (n \times \log_2 n) + log_2 n (n×log2n)+log2n 左右吧!对于数据量大的话是比较占有优势的。
4、代码示例
# 输入
n = int(input())
num = [[j + 1, int(val)] for j, val in enumerate(input().split(' '))]
s = int(input())
# 排序
num.sort(key=lambda x: x[1])
# 查询
l, r = 0, n - 1
while l < r:
b = num[l][1] + num[r][1]
if b < s:
l += 1
elif b > s:
r -= 1
else:
if num[l][0] > num[r][0]:
num[l][0], num[r][0] = num[r][0], num[l][0]
print('%d %d' % (num[l][0], num[r][0]))
break