编码挑战2

时间:2020-06-30 16:51:26

标签: algorithm language-agnostic

在具有连续正负1的数组中查找元素。我可以通过线性搜索在O(n)时间内实现。有什么有效的方法可以在不到O(n)的时间内实现。

我的意思是正负1是数组中的2个连续数字的差值是-1或1

例如示例数组输入

连续元素的差值为+1 arr = [1,2,3,4,5]

连续元素的差异为-1 arr = [-1,-2,-3,-4,-5,]

元素之间的差异为+1或-1

arr = [-5,-4,-3,-4,-3,-2,-1,0,1,2,3,4,3,2,1]

注意:数组未排序

示例

arr = [-5,-4,-3,-4,-3,-2,-1,0,1,2,3,2,1,2,3,4,5,6,5,4,3,2,1,0,-1,-2,-3,-4,-3,-2,-1]
while i <= arr.length do 
  if num == a[i]
    puts "found"
    break
  end
  i += 1
end

我认为不是从0索引开始的第二种方法,我做了一些自定义逻辑

    num = gets.to_i
    i = 0
    if (num < 0 && arr[0] < 0) || (num > 0 && arr[0] < 0)
      i = (num + arr[0].abs).abs
    elsif num < 0 && arr[0] > 0
      i = num.abs + arr[0]
    elsif num > 0 && arr[0] > 0
      i =  (num > arr[0] ? (num - arr[0]) : (arr[0] - num)) 
    end
      
    while i <= arr.length do 
      if num == a[i]
        puts "found"
        break
      end
      i += 1
    end

1 个答案:

答案 0 :(得分:0)

正如Nico Schertler所说,O(n)是您能做的最好的事情。这是一个查找操作,对未排序数据的查找操作始终为O(n),因为在最坏的情况下,它们必须检查每个元素。如果您的数据已排序,则情况会有所不同。参见binary search

还要注意,您的示例代码无法满足您的要求,它只是在列表中找到某个数字num。您的示例代码等效于:

arr.find { |i| i == num }

您似乎要的是

arr.find { |i| i == num - 1 or i == num + 1 }