所以我试图找到解决我的两个总和问题并且我被卡住了,我需要打印添加到目标的元素的索引,如果是一半,我的解决方案将返回一个元素两次目标
def two_sum(nums, target)
num_hash = Hash.new(0)
nums.each_with_index do |num,idx|
num_hash[num] = idx
if num_hash.key?(target - num) && target % num != 0
return [num_hash[num], idx]
end
end
end
答案 0 :(得分:2)
所以我不认为这个问题与目标数量的1/2有关,它似乎只是“如果找到一个解决方案,它会返回两次相同的索引”。例如,使用样本集[2, 7, 11, 15]
two_sum([2, 7, 11, 15], 14) # => [2, 7, 11, 15]
因此,7
是14
的一半,它是目标,而不是像你建议的那样两次返回索引1
,它返回原始输入数组( nums.each_with_index
的结果。但是,如果我们尝试传递9
的目标,它的行为与您描述的一致:
two_sum([2, 7, 11, 15], 9) # => [1, 1]
原因在于:
return [num_hash[num], idx]
您已将num
设置为num_hash
(num_hash[num] = idx
),然后您将返回idx
和num_hash[num]
,这也是{{} 1}}。所以你想要做的是:
idx
然后“修复”未找到结果时返回的所有元素,只需在方法结束时返回return [num_hash[target - num], idx]
:
[]
现在:
def two_sum(nums, target)
num_hash = Hash.new(0)
nums.each_with_index do |num,idx|
num_hash[num] = idx
if num_hash.key?(target - num) && target % num != 0
return [num_hash[target - num], idx]
end
end
[]
end
注意:您也遇到代码问题,如果您有两次相同的号码,则找不到答案:
two_sum([2, 7, 11, 15], 14) # => []
two_sum([2, 7, 11, 15], 9) # => [0, 1]
留给你弄清楚,只是想指出这一点。
答案 1 :(得分:1)
您可以在此处使用Array#combination方法。
if (array[q] > target) {
r = q - 1; // index lower to current pivot
} else {
p = q + 1; // index upper to current pivot
}
有关
def two_sum(nums, target)
nums.each_index.to_a.combination(2).select { |i,j| nums[i] + nums[j] == target }
end
two_sum([2, 7, 11, 15], 14)
#=> []
two_sum([2, 7, 11, 15], 9)
#=> [[0, 1]]
two_sum([2, 4, 7, 5], 9)
#=> [[0, 2], [1, 3]]
two_sum([2, 2, 2, 2], 4)
#=> [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
two_sum([2, 4, 7, 5], 8)
#=> []
步骤如下。
nums = [2, 4, 7, 5]
target = 9
我们可以看到这个枚举器通过将它转换为数组而生成的元素。
a = nums.each_index
#=> #<Enumerator: [2, 4, 7, 5]:each_index>
接下来,
b = a.to_a
#=> [0, 1, 2, 3]
其余的很简单,因为c = b.combination(2)
#=> #<Enumerator: [0, 1, 2, 3]:combination(2)>
c.to_a
#=> [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
只选择传递给它的那对索引(select
),其对应的值i,j
和num[i]
总和为{{1} }}
答案 2 :(得分:0)
我想你想要的是......
return [num_hash[target-num], idx]