列表两数之和 给定一个已按照非递减顺序排列的整数数组numbers,请你从数组中找出两个数满足相加之和等于target 函数应该以长度为2的整数数组的形式返回这两个数的下标值。numnbers的下标值从1开始,所以答案数组应当满足1<=answer[0]<answer[0]<=numbers.length 你可以假设每个输入只对应唯一的答案而且你不可以重复使用相同的元素 示例: 输入:numbers=[2,7,11,15],target=9 输出:[1,2]
提示:
1,numbers按照非递减顺序排列
2,仅存在一个有效答案
3,2<= numbers.length?
import time
class Solution(object):
@staticmethod # 修饰
def twosum(numbers, target): # 定义函数并传递参数
d = {} # 空字典
size = 0 # 索引
while size < len(numbers): # 如果索引小于列表长度,控制迭代范围
if not numbers[size] in d: # 确保无重复元素,如果字典中没有则添加
d[numbers[size]] = size + 1 # 按次向字典中添加key和value,字典的key是列表参数中的元素,value是元素在列表中的位置
print('d=', d) # 打印当前字典
print('target - numbers[size]=', target - numbers[size], 'size=', size) # 打印当前差值及元素在列表中的位置
if target - numbers[size] in d: # 如果 差(target - numbers[size])在字典中
if d[target - numbers[size]] < size + 1: # 确认位置数据在有效区间,找到的数据在目前的数据位置(size+1)之前,因为是先添加的数据及位置,
"""
避免出现一下情况:
输入:ns = [2, 11, 7, 15] target = 22
输出:[2,2]
"""
answer = [d[target - numbers[size]], size + 1] # 通过差值及字典找到第一个数的位置信息,size+1直接找到第二数的位置
return answer # 返回列表
size = size + 1
time.sleep(1)
ns = [2, 11, 7, 15] # 列表
tg = 9 # 目标和
st = Solution()
print(f'{tg}:',st.twosum(ns, tg))
print('---------------')