在具有连续正负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
答案 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 }