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

时间:2016-10-16 01:52:13

标签: 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

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

5 个答案:

答案 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);

查看LeetCode enter image description here

中的详细信息

答案 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