【发布时间】:2018-04-11 05:35:15
【问题描述】:
我在一次采访中得到了这个问题。
假设您有一个 未排序的整数 数组,其可能值为正、负和零。您还有一个变量k,其中包含一个整数。现在找到乘积大于k 的一对或多对,非重复的,如果存在的话。
k 可以是任何值,+ve、-ve 或零
约束:您不能操作数组,这意味着任何排序或复制原始数据,然后排序或更改值都会受到限制。
如果可能的话,它应该低于 O(n^2) 时间复杂度和最小空间(没有明确提到空间,但他们说尽可能使用最低)
例如:给定Array [0,-1, 5, 45, 4, 1, -3] 和k = 20
我的解决方案是在面试时给出的:
我的解决方案:
第一个是蛮力使用O(N^2) 并试图获取该对的产品并进行检查。现在我即兴创作了以下逻辑
假设k = 40,我得到array[i] = 2。现在int divide = k/array[i]。
divide+ = 1。如果我遇到任何数字说array[j] > divide 和array[j] < k,那么int product = array[i] * array[j] 的乘积将是product > k。
逻辑:
如果我有一个数字 1000 并且我得到了 array[i] = 3 的某个值 i。如果我得到n = 1000 / array[i] 并增加n = n+1,并且如果n 存在于数组中,则n * array[i] > 1000 的乘积
编辑:+ve 表示正,-ve 表示负,并找到所有对,而不是在第一对停止。 编辑 2 我们可以在任何新的数据结构中存储最少数量的条目,但它应该是最小的,而不是原始的完整副本或该数据结构中的元素过多
【问题讨论】: