思路一:嵌套循环查找两数之和
function findTwoNumbers1(arr:number[],n:number):number[]{
const res:number[]=[]
const length=arr.length
if(length===0) return res
for(let i=0;i<length-1;i++){
const n1=arr[i]
let flag=false //是否得到了结果
for(let j=i+1;j<length;j++){
const n2=arr[j]
if(n1+n1===n){
res.push(n1)
res.push(n2)
flag=true
break
}
}
if(flag) break
}
return res
}
时间复杂度达到O(n^2)就是不可用的算法
思路二:双指针
利用递增的特性
随便找两个数
如果和大于n,则需要向前寻找
如果和小于n,则需要向后寻找
/*双指针,时间复杂度降到O(n)
定义i指向头,j指向尾,求arr[i]+arr[j]
如果大于n,则j需要向前移动
如果小于n,则j需要向后移动
*/
function findTwoNumbers2(arr:number[],n:number):number[]{
const res:number[]=[]
const length=arr.length
let i =0 //头
let j = length-1 //尾
while(i<j){
const n1=arr[i]
const n2=arr[j]
const sum=n1+n2
if(sum>n){
//j向前移动
j--
}else if(sum<n){
i++
}else{
res.push(n1)
res.push(n2)
break
}
}
return res
}
凡有序必二分
优化嵌套循环,可以考虑双指针