算法与数据结构面试题(14)-在数组中查找2个数的和为已知数

题目


题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15 和数字15。由于4+11=15,因此输出4 和11。


解题思路


如果想要让时间复杂度为O(n),就需要采用hash表保存数组中的数。这样查找的时候时间复杂度为O(1),然后遍历这个数组,所用的时间复杂度为O(n)。加入输入的数为M,数组为data,那么问题转化为从hash表中查找M-data[i]的数。那么时间复杂度为O(n)*O(1),可视为O(n)。



代码


public class Problem14 {

	public void getTwoNumber(int[] data, int sum) {
		if (data == null || data.length == 0) {
			return;
		}
		int length = data.length;
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		// 时间复杂度为O(n)
		for (int i = 0; i < length; i++) {
			map.put(i, data[i]);
		}
		// 时间复杂度为O(n)
		for (int i = 0; i < length; i++) {
			int find = sum - data[i];
			if (map.containsValue(find)) {//时间复杂度为O(n)
				System.out.println(String.format("满足要求的数为 %d, %d", data[i],
						find));
			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}




你可能感兴趣的:(数据结构,算法)