从一个数组中找出两个元素相加等于目标数字,时间复杂度为O(n)
一、题目描述
从给定的数组中,找出两个元素相加等于目标元素,每个元素不能重复使用,并且时间复杂度等于O(n)
数组num[2, 3, 6, 1, 4, 7, 5, 1]
目标数为:7
输出:
[1, 6]
[2, 5]
[3, 4]
二、解题思路
- 对数组进行升序排列
- 设 i 从前开始往后加 1,设 k 从后往前减 1
- 当下标为 i 的元素加上下标为 k 的元素小于目标元素,证明下标为 i 的元素太小,因为是升序排列,所以 i ++
- 当下标为 i 的元素加上下标为 k 的元素大于目标元素,证明下标为 k 的元素太大,因为是升序排列,所以 k –
- 当下标为 i 的元素加上下标为 k 的元素等于目标元素,将两个元素存入一个新的数组 tNum。由于每个元素不能重复使用,因此 i ++ , k - -
- 返回数组 tNum
- 两两输出 tNum中的元素
三、代码实现
var tNum = []; //定义全局变量tNum数组
function search(num, target) {
var counter = 0;
num.sort(function(a, b) {
return a - b;
}); //将数组 num 进行升序排列
var k = num.length - 1; //声明 k 为数组的末尾下标
var i = 0; //声明 i 为数组第一个元素的下标
while (i < k) {
if (num[i] + num[k] < target) {
i++; //当前后两个元素相加小于目标元素时,将前面的元素往后遍历一位
} else if (num[i] + num[k] > target) {
k--; //当前后两个元素相加大于目标元素时,将后面的元素往前遍历一位
} else { //当两个元素相加等于目标元素时
tNum[counter] = num[i]; //将小的元素放入tNum数组
tNum[counter + 1] = num[k]; //将大的元素放入小的元素的后面一位
i++;
k--;
counter = counter + 2;
}
}
return tNum;
}
search([2, 3, 6, 1, 4, 7, 5, 1], 7);
for (var j = 0; j < tNum.length; j = j + 2) {
console.log("[" + tNum[j] + "," + tNum[j + 1] + "]");
console.log(tNum);
}
本文讲解了如何利用升序遍历的策略,在给定数组中寻找两个元素相加等于目标值的解决方案,时间复杂度仅为O(n),并提供了详细步骤和代码实例。
814

被折叠的 条评论
为什么被折叠?



