给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
时间复杂度O(n)
var add = function(nums,target){
var obj = {}
for(let i =0; i<nums.length; i++) {
if(typeof obj[nums[i]] !== 'undefined') {
return [obj[nums[i]], i]
}
obj[target-nums[i]] = i
}
}
运行结果:add([1,2,3,4,5,6,7],5)
(2) [1, 2]
(2)[1, 2]
0: 1
1: 2
length: 2
proto: Array(0)
如果,nums是有序的,则可以首先删除部分元素
var ad = function(nums,target) {
for(let i = 0; i<nums.length; i++) {
if((nums[0] + nums[i])>target){
nums.splice(i,nums.length-i)
}
}
return nums
}
运行结果:ad([1,2,3,4,5,6,7],5)
(4) [1, 2, 3, 4]
(4)[1, 2, 3, 4]
0: 1
1: 2
2: 3
3: 4
length: 4
proto: Array(0)
接下来,类似四个数的和为target,目前的时间复杂度较高,还没有找到优化的方法,欢迎各位大佬指正
function findNumber(nums, target) {
//判断边界情况
if(nums.length < 4) return 0
var result = []
nums.sort((a,b) => a-b) //排序
for(let i = 0; i < nums.length-3; i++) {
if(i > 0 && nums[i] === nums[i-1]) continue
for(let j = i + 1; j < nums.length-2; j++) {
if(j > i + 1 && nums[j] === nums[j-1]) continue
let k = j + 1, l = nums.length - 1
while (k < l) {
let temp = nums[i] + nums[j] + nums[k] + nums[l]
if(temp == target) {
result.push([nums[i], nums[j], nums[k], nums[l]])
while(k < l && nums[k] === nums[k+1]) {
k++
}
while(k < l && nums[l] === nums[l-1]) {
l--
}
k++
l--
} else if (temp < target) {
k++
} else if(temp > target) {
l--
}
}
}
}
return result
}