我正在尝试使用两和算法来传递LeetCode并且遇到时间限制导致它失败。
我不确定如何让我的代码更快以使其通过。在这个问题中,我得到一个整数数组(nums)和一个目标值,nums数组中的两个数字必须相加。找到这些数字后,以数组的形式返回它们的索引值。
def two_sum(nums, target)
numbers_hash = Hash[(0...nums.size).zip(nums)]
numbers_hash.delete_if do |k, v|
key_indicies = ((numbers_hash.select { |ki,vi| vi == (target - v) }.keys) - [k])
key_indicies.empty? ? true : (return [k, key_indicies].flatten)
end
return "Couldn't find target value"
end
我可以保留原始的nums数组并在delete_if
的循环内循环来修改迭代的数组,并在找到正确的目标值时返回。我更喜欢使用散列方法,因为它更具可读性,我不认为时间限制将数组转换为散列很多。
答案 0 :(得分:5)
人们指出三元组问题的原因通常表明你的过程过于复杂。你正在检查它是否为零。在尝试最大限度地减少对行的使用时,你会使自己的代码更难以阅读,并且当它集成到更复杂的代码结构中时它可能“起作用”,对于你自己以后阅读将是一个绝对的噩梦。 / p>
def two_sum(nums, target)
search = {}
nums.each_with_index do |num,i|
return [search[target-num], i] unless search[target-num].nil?
search[num] = i
end
end
比以下更容易理解和后续审核:
def two_sum(a,g)s={};a.each_with_index{|n,i|s[g-n]==nil ?s[n]=i:(return[s[g-n],i])}end
尽管如此,它们基本上完全相同。
答案 1 :(得分:2)
在思考了一段时间之后,我意识到我正在从错误的方向接近问题。我应该逐个添加元素到哈希表,而不是构建一个潜在的巨型哈希表,每次都要在添加新键之前检查解决方案是否存在:value
def two_sum(nums, target)
numbers_hash = {}
nums.each_with_index do |number, index|
numbers_hash[index] = number
hash_key = ((numbers_hash.select { |k,v| v == (target - number) }.keys) - [index])
hash_key.empty? ? false : (return [hash_key, index].flatten)
end
return "Couldn't find target value"
end
这比我以前的解决方案运行得快得多。
答案 2 :(得分:2)
请参阅下面的解决方案:它效率更高,即比两个Ruby提交的所有Ruby提交的25.43%快292毫秒,并且比所有Ruby提交的100%少使用9.5MB。值得一看。很简单。
var tDict = TestItem.GetDictOfClass(e => e.StockCode, e.Price, e.Onhand);
中的详细信息
答案 3 :(得分:0)
我不明白为什么你需要使用哈希。我会使用两个each_with_index
并循环遍历nums
数组
def two_sums(nums, target)
nums.each_with_index do |num1, idx1|
nums.each_with_index do |num2, idx2|
next if idx1 == idx2
return [idx1, idx2] if num1 + num2 == target
end
end
return "Couldn't find target value"
end
答案 4 :(得分:0)
我的解决方案
def two_sum(nums, target)
nums.each_with_index do |num, index|
result = target - num
position = nums.index(result)
return [index, position] if position && (position != index)
end
end