Javascript 重构嵌套For循环

Javascript 重构嵌套For循环,javascript,arrays,for-loop,nested-loops,Javascript,Arrays,For Loop,Nested Loops,说明 给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标 您可以假设每个输入都有一个解决方案,并且不能两次使用同一个元素 示例 Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]. 如何重构它以消除嵌套for循环?我想降低时间复杂度 代码 Given nums = [2, 7, 11, 15], target = 9, Because num

说明

给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标

您可以假设每个输入都有一个解决方案,并且不能两次使用同一个元素

示例

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
如何重构它以消除嵌套for循环?我想降低时间复杂度

代码

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
consttwosum=函数(nums,目标){
for(让我输入nums){
for(让j表示nums){
如果(nums[i]+nums[j]==target&&nums[i]!=nums[j]){
返回[i,j];
}
}
}
};

log(twoSum([2,7,11,15,9])您可以保存每个元素与对象内目标的差异,结果作为键,索引作为值。这将在不循环整个内容的情况下检查对象中是否存在元素。在另一个循环中,检查数组元素是否存在于对象中,如果存在,则获得了该对。附加条件是防止将元素与自身进行比较。
consttwosum=函数(nums,目标){
常数temp={};

对于(设i=0;i可以用
O(n)
时间来解决这个问题。这种方法要解决的条件是数组必须排序

让twosum=(arr,x)=>{
设s=0,
e=arr.长度-1;
设loc=[];
而(sconsole.log(twosum([2,7,11,15,9]);
由于这似乎是家庭作业,我将提出一些建议,但不会给出完整的解决方案:

  • 您当前的代码正在重复索引检查。例如,您在索引[0,1]和[1,0]上循环,自a+b=b+a以来,这两个索引的总和始终相同。相反,我建议您的
    I
    循环从0转到len-1,而
    j
    循环从I+1转到len-1。这样您就永远不会重复检查
  • 当前检查的一部分包括
    nums[i]!=nums[j]
    的条件,但您的问题并没有说明数组中的两个值不能相同。是否可以使用
    toSum([1,4,4],8)
    这样的值调用此函数,使4+4=8?如果是,则可以删除
    nums[i]!=nums[j]
    检查以节省时间
  • 不清楚所提供的数组是否已排序。如果未排序,则可以创建一个跟踪变量来说明已检查的值,并防止在以后的迭代中检查这些值。例如,如果已将值4与数组中的所有其他值进行比较,但未找到解决方案,则如果在以后的迭代中遇到4数组,没有理由检查它

for…in…
不适用于阵列阵列阵列将始终进行排序与否?到目前为止,您自己尝试了什么来解决这个问题?算法没有那么复杂。“我想降低时间复杂度。”-没有比这更好的了。@Andreas是的,我也被告知了,但在这种情况下,问题是要求返回两个元素的索引,这两个元素加起来就是目标。我还能用什么来代替呢?
twoSum([2,11,15,7],9)
这只解决给定测试用例中的给定问题,而不是解决所有情况下的给定问题。欣赏响应,它可以工作,但在尝试不同的测试用例时,
[3,3],6
,它给了我
未定义的
谢谢@Andreas,我认为对数组进行排序可以解决问题。OP需要元素的索引。排序会破坏顺序/索引。它返回
[0,1]
第二种解决方案。这不是家庭作业,这是leetcode的一个问题,我曾经尝试过,只是好奇如何在不使用嵌套for循环的情况下重构