我有一个随机顺序的正整数数组。数字 x 从列表中给出,我们需要在列表中找到任意两个数字 总和等于 x 。运行时间必须小于n ^ 2.
{编辑} 我所做的是,我把所有数字都放在一个数组中不到x的一半,而在另一个数组中放入大于x的一半,并且丢弃所有大于x的数字,然后想法是必须从两个数组中得到两个数字(不是来自单个数组)并通过迭代我可以得到两个数字。
现在对于最坏的情况,我有点困惑的是,方法是好的吗?或者,如果有人指导我比这更好的东西,我们还可以实现 log n 或 n * log n 吗?
答案 0 :(得分:8)
你的解决方案都错了,并在O(n^2)
。
x=5
和arr=[1,2,3,5]
这是错误的 - 所需的两个数字来自一个数组,而不是两个数组。arr=[3,3,6]
,x=6
,您将两个3
放在一个列表中(例如,不大于x/2
),将会找不到{ {1}}。3+3=6
中运行,因为假设正好一半的元素大于O(n^2)
1 ,一半小于x
。然后,您需要检查的组合数量为x
要在(n/2*n/2) /2 = n^2/8
中解决问题,请考虑如果对数据进行排序会发生什么,给定数字O(nlogn)
,如果现在排序的数组中有一个数字arr[i]
,您能否有效找到?
您甚至可以通过将元素放在哈希集中来增强上述x-arr[i]
平均值,现在,如果给出一个数字O(n)
,如果y
是x-y
,您是否可以有效找到还在集合中?
修改强> 由于OP编辑了这个问题,因此引出的部分不再相关,而是引起了一个新的关注原因。
(1)编辑问题中的x/2
。
答案 1 :(得分:2)
这是O(n)解决方案,用于查找与预期目标相加的第一对数组索引。解决方案将在找到前两个索引求和目标时停止,如果你需要所有加起来的对而不是使用int []结果,你可以使用ArrayList甚至是Map,处理完整的数组和用所有索引对返回它。有一个明显的假设是Map的hashcode函数非常好并且碰撞不多,因此map操作在O(1)时间内执行。
import java.util.*;
public class Solution {
public static void main(String[] args) {
int[] array = new int[] {1,2,4,7,12,67,12,5,9,1,10};
System.out.println(Arrays.toString(sum(array, 68)));
}
public static int[] sum(int[] array, int target) {
int[] result = new int[2];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// n iterations
for (int index = 0; index < array.length; index++) {
// constant
if (map.containsKey(target - array[index])) {
result[1] = index;
// constant
result[0] = map.get(target - array[index]);
return result;
}
// constant
map.put(array[index], index);
}
return result;
}
}
答案 2 :(得分:1)
你走了,
使用合并排序对数组进行排序(时间复杂度:n logn
)。拿两个指针/计数器,说i
&amp; j
,一个从索引0
开始,另一个从n-1
开始(假设n
数组的大小为n
)。
if array[i]+array[j]=sum
return;
else if (array[i]+array[j]<sum) i++;
else j--;
直到i>j
。
整体时间复杂度: n logn
答案 3 :(得分:1)
/ *时间复杂度= O(n) - 因为HashMap操作需要O(1)时间* /
if(sts.equals("succuss"))
{
Log.v(TAG,"in success block");
lflag=true;
}
答案 4 :(得分:0)
public void function(int [] array,int sum){
for(int i = 0; i < array.length/2; i ++){
for(int j = array.length-1;; j--){
if(array[i]+array[j] < sum) break;
if(array[i]+array[j] == sum) System.out.println(array[i]+" + "+array[j]+" = "+sum);
}
}
}