1、两数之和
原题【第一题】
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路一:暴力破解,时间复杂度O(n²)
双层for循环,找到符合条件的数,返回。
var twoSum = function(nums, target) {
let len = nums.length
for(let i =0;i<len;i++){
for (let j = i+1; j < len; j++) {
if (nums[i]+nums[j]===target) {
return [i,j]
}
}
}
};
思路2:借助一个临时数组存放遍历过的数据,时间复杂度O(n)
var twoSum = function(nums, target) {
let len = nums.length;
const temp = [];
for (let i = 0; i < len; i++) {
let next = target - nums[i];
if (temp[next]!==undefined) {
return [temp[next],i]
}
temp[nums[i]] = i
}
};
2、三个数之和
原题【第15题】
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解题:
var threeSum = function(nums) {
nums.sort((a, b) => a - b)
let len = nums.length;
let res = [];
if (nums[0] <= 0 && nums[len - 1] >= 0) {//三数之和才可能为零
let i = 0;
while (i < len - 2) {
if (nums[i] > 0) {//最左侧的值大于0 三数和不可能为0
break
}
let first = i + 1;
let last = len - 1;
while (first < last) {
if (nums[i] * nums[last]>0) {//三个数同符号 无解
break;
}
let sum = nums[i] + nums[first] + nums[last]
if (sum === 0) {
res.push([nums[i], nums[first], nums[last]])
}
if (sum <= 0) {
while (nums[first] === nums[++first]) { }
} else {
while (nums[last] === nums[--last]) { }
}
}
while (nums[i] === nums[++i]) {
}
}
}
return res;
};