leedcode-指针篇(1)

有序数组的two sum 2

题目

给定一个已按照升序排列的整数数列 number,请你从数组中找出两个数满足相加之和等于目标数target。
注意:函数应该以长度为2的整数数组的形式返回这两个数的下标值。numbers的下标从1开始计数,答案应该满足1<=answer[0] 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:

input: numbers=[2,7,11,15] target=9
output: [1,2]
explain: 2 add 7 equal 9. thus index1 correspond to 1 and index2 correspond to 2 
attention to the question is the index of number should count from 1. so we should auto add one from the origin index number.

解题思路

因为它是升序数列,因此可以借助首尾指针方式进行比对。如果首尾指针所指向的值之和刚好相等于target,那么就可以返回下标,如果大于target,那么说明尾部指针指向的数过大,应该收缩尾部指针指向的位置,使得整体的加和变小。如果小于target,那么说明首部指针指向的数过小,应该将首部指针往后移动,指向相对大的数字来增加首尾指针指向的数的加和。
注意:为了保持良好的思路结构,需要首先判断输入数组是否为空,这一步往往容易漏掉,此处如果出现列表越界,那大概率是因为你的尾指针写错了,千万要注意是end-=1,如果你不集中精神相当然地写,就很容易写错为end+=1

代码

class Solution:
	def twoSum(self,numbers:List[int],target:int)->List[int]:
		if not numbers:
			return []
		
		start,end=0,len(numbers)-1
		while start<end:
			_sum=numbers[start]+numbers[end]
			if _sum<target:
				start+=1
			elif _sum>target:
				end-=1
			else:
				return [start+1,end+1]
		return []

测试用例

def twoSum(numbers,target):
	if not numbers:
		return []
	start,end=0,len(numbers)-1
	while start<end:
		_sum=numbers[start]+numbers[end]
		if _sum<target:
			start+=1
		elif _sum>target:
			end-=1
		else:
			return [start+1,end+1]
	return []

numbers=[0,2,4,5,6,8,9]
target=6
print(twoSum(numbers,target))

拓展

如果我想把所有符合首尾指针相加等于target的下标输出那怎么办?
我首先想到的是加多一个列表,把结果存储起来一起返回,这可能是比较暴力吧哈哈,欢迎大佬能给出更优的方案。
思路是再加个判断,首尾指针未重叠,可继续迭代判断。

def twoSum(numbers,target):
	
	starts=[]
	ends=[]
	if not numbers:
		return []
	start,end=0,len(numbers)-1
	answer=[]
	while start<end :
		_sum=numbers[start]+numbers[end]
		if _sum<target:
			start+=1
			starts.append(start)
		elif _sum>target:
			end-=1
			ends.append(end)
		elif _sum==target and (start+end)>0:
			answer.append([start+1,end+1])
			start+=1
		else:
			return answer.append([start+1,end+1])
	return answer

numbers=[0,2,4,5,6,8,9]
target=6
print(twoSum(numbers,target))

你可能感兴趣的:(leedcode刷题,指针)