Ruby运行时中的两个求和算法不会传递给LeetCode

Sea*_*rko 2 ruby algorithm hash

我试图得到一个两和算法来传递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
Run Code Online (Sandbox Code Playgroud)

我可以保留原始的nums数组并在循环内执行循环,delete_if以修改迭代的数组,并在找到正确的目标值时返回.我更喜欢使用哈希方法,因为它更具可读性,我认为将数组转换为哈希的时间限制并不多.

One*_*une 7

人们指出三元组问题的原因通常表明你过度复杂化了一个过程.你正在检查它是否为零.虽然尝试最大限度地减少对行的使用,但是使自己的代码更难以阅读,并且当它集成到更复杂的代码结构中它可能"工作"时,即使是自己以后阅读也是绝对的噩梦.

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
Run Code Online (Sandbox Code Playgroud)

比以下更容易理解和审查:

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
Run Code Online (Sandbox Code Playgroud)

尽管如此,它们基本上完全相同.