给一个递增的数组,找到两个和为N 的元素
题目
输入 arr=[1,2,3,4,5,6,11] n=10 输出 [4,6]
思路1
最简单的就是嵌套循环,两个for 循环,来判断和为n, 复杂度为O(n^2), 这个方案不可取
代码实现
function findTwoList (arr: number[], n: number):number[] {
if (arr.length === 0) return []
const res:number[] = []
for(let i=0; i<arr.length; i++) {
const f = arr[i]
for (let j =i+1; j<arr.length; j++) {
const s = arr[j]
if (f + s === n) {
res.push(f)
res.push(s)
break
}
}
}
return res
}
思路2 双指针
利用递增有序的特性
- 定义两个指针,分别指向数组的开始和结尾
- 遍历数组,用首尾相加之和 与 n 做比较,大于n 尾部向头移动, 小于n 头部向尾部移动, 等于n 就返回两个数的数组
- 两个指针相同了, 还没有找到对应的值, 返回空数组
- 复杂度为O(n)
双指针代码实现
function findTwoList2 (arr:number[], n: number): number[] {
let res: number[] = []
let fIndex: number = 0;
let eIndex: number = arr.length - 1;
while(fIndex < eIndex && res.length===0) {
const sum = arr[fIndex] + arr[eIndex]
if (sum > n) {
eIndex --
}else if (sum < n) {
fIndex ++
}else {
res.push(arr[fIndex])
res.push(arr[eIndex])
}
}
return res
}
2周刷完100道前端优质面试真题 mu课 视频及资料领取请关注:奋斗的刚子