给出一个整数数组,返回两个数字的索引,以便它们加起来成为一个特定的目标。
示例:
给出数字=
[3, 2, 4]
,目标= 6,因为
nums[1] + nums[2]
= 2 + 4 = 6
return [1, 2]
。
解决方案
var twoSum = function(nums, target) {
for(let i = 0; i <= nums.length; i++){
for(let j = 0; j <= nums.length; j++){
if(nums[i] + nums[j] == target){
return [i, j]
}
}
}
};
上面的代码在其他情况下有效,但在这种情况下无效。
预期结果 [1,2]
输出 [0,0]
例如,我尝试使用不同的数字数组和不同的目标,即使您更改数字的顺序也可以使用
示例:
新数组:[15, 7, 11, 2]
,目标= 9,
输出: [1, 3]
。
我不了解解决方案出了什么问题,希望有人可以解释。谢谢
答案 0 :(得分:2)
您可以使用一种非常简单的技术。
基本上,您可以检查当前迭代中目标和元素的差异是否存在于数组中。
假设同一个索引不能重复使用
nums = [3, 2, 4], target = 6
nums[0] = 3
target = 6
diff = 6 - 3 = 3
nums.indexOf[3] = 0 // FAILURE case because it's the same index
// move to next iteration
nums[1] = 2
target = 6
diff = 6 - 2 = 4
nums.indexOf(4) = 2 // SUCCESS '4' exists in the array nums
// break the loop
这是 leetcode 接受的答案。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
for (let index = 0; index < nums.length; index++) {
const diff = target - nums[index];
const diffIndex = nums.indexOf(diff);
// "diffIndex !== index" takes care of same index not being reused
if (diffIndex !== -1 && diffIndex !== index) {
return [index, diffIndex];
}
}
};
运行时间:72 毫秒,比两个 Sum 的 93.74% 的 JavaScript 在线提交快。
内存使用:38.5 MB,不到两和的 JavaScript 在线提交的 90.55%。
谁能帮我减少内存使用量?
答案 1 :(得分:1)
我不知道解决方案出了什么问题,我希望 有人可以解释吗?
在这里,内循环和外循环都是从0
th 开始的,因此在[3,2,4] and target 6
的情况下,它将以[0,0]
的形式返回3 + 3
等于目标,因此要照顾到同一索引元素不被使用两次,会在外循环和内循环之间产生1
差异
使外部循环从0
th 索引开始,内部循环从值i+1
var twoSum = function(nums, target) {
for(let i = 0; i < nums.length; i++){
for(let j = i+1; j < nums.length; j++){
if(nums[i] + nums[j] == target){
return [i, j]
}
}
}
};
console.log(twoSum([15, 7, 11, 2],9))
console.log(twoSum([3, 2, 4],6))
答案 2 :(得分:0)
您的解决方案按预期工作。对于nums = [3, 2 ,4]
和target = 6
,[0, 0]
是概述问题nums[0] + nums[0] = 3 + 3 = 6
的有效解决方案。
如果您需要两个不同的索引(根据我的理解,任务不需要这样做),则可以添加其他不等式检查(nums[i] + nums[j] == target && i != j
)。
答案 3 :(得分:0)
var twoSum = function (nums, target) {
var len = nums.length;
for (var i = 0; i < len; i++) {
for (var j = i + 1; j < len; j++) {
if (nums[i] + nums[j] == target) {
return [i,j];
}
}
}
};
答案 4 :(得分:0)
var twoSum = function(nums, target) {
for(var i=0;i<nums.length;i++){
for(var j=i+1;j<nums.length;j++){
temp = nums[i]+nums[j];
if(temp == target){
return [i,j]
}
}
}
};
console.log(twoSum([15, 7, 11, 2],9))
console.log(twoSum([3, 2, 4],6))
console.log(twoSum([3,3],6))
这完美运行,运行时间:比 84 毫秒少 72 毫秒
答案 5 :(得分:0)
另一种解决时间复杂度为 O(n) 的问题的有效方法是不使用嵌套循环。我评论了步骤,让JS开发者容易理解。这是我使用 golang 的解决方案:
func twoSum(intArray []int, target int) []int {
response := []int{-1, -1} // create an array as default response
if len(intArray) == 0 { // return default response if the input array is empty
return response
}
listMap := map[int]int{} // create a Map, JS => listMap = new Map()
for index, value := range intArray { // for loop to fill the map
listMap[value] = index
}
for i, value := range intArray { // for loop to verify if the subtraction is in the map
result := target - value
if j, ok := listMap[result]; ok && i != j { // this verify if a property exists on a map in golang. In the same line we verify it i == j.
response[0] = i
response[1] = j
return response
}
}
return response
}
答案 6 :(得分:-1)
var twoSum = function(nums, target) {
for(let i=0; i<nums.length; i++){
for(let j=i+1; j<nums.length; j++){
if(nums[j] === target - nums[i]){
return [i, j];
}
}
}
};