2016-11-23 14 views
0

タイトルには、合計がターゲット整数に等しい2つの要素があります。私はすでに以下のソリューションを試しましたが、これはユニークな整数に対してのみ機能します。重複する値になると問題が発生します。もちろん、2つの別々のインデックスを追跡している複数のループを使用することができます。このように、2つのインデックスが同じであることを確認してください。しかし、私は1つの反復でこれを解決する方法があるかどうかを見たいと思っていました。整数とターゲットの配列が与えられている場合、2つの要素の合計がターゲットになる場合はtrueを返します。

two_sum([1,2,3,4,5,6], 8) = true 
two_sum([4,4], 8) = false 

def two_sum(array, target) 
    idx = 0 
    while idx < array.length 
    complement = target - array[idx] 
    if array.include?(complement) && complement != array[idx] 
     return true 
    end 
    idx+=1 
    end 
    return false 
end 

答えて

0
def two_sum(array, target) 
    array.combination(2).each { |pair| return true if pair.inject(:+) == target } 
    return false; 
end 
+5

'array.combination(2).any? {| a、b | a + b == target} ' – steenslag

+2

私は' array.combination(2).find {| a、b | a + b == target} 'は、目的のペアまたは' nil'のいずれかを返します。編集:エガド! @steenslagは、同じブロック変数であっても、私がやった1分前とほぼ同じコメントを投稿しました!私は希望のペアが求められているので、 'find'は' any'より優先されると思います。 –

+1

@CarySwovelandヘッダーから: "... 2つの要素のいずれかがターゲットになるとtrueを返します"。 – steenslag

2
require 'set' 

def two_sum(arr, tot) 
    st = Set.new 
    arr.each { |n| st.include?(tot-n) ? (return true) : st << n } 
    false 
end 

two_sum [1,2,3,4,5,6], 8 #=> true 
two_sum [4,4], 8   #=> true 
two_sum [1,2,3,4,5,6], 3421 #=> false 

あなたは[n, tot-n]trueを置き換える(あるいは単にnを返し、他はtot - nである)、(ときtruetotに二つの値の和を返すことを好むと思います。

私はより高速なルックアップのために配列ではなくセットを使用しました。

+0

O(n)対O(n ** 2)です。ニース! – pjs

関連する問題