任务:给定一个整数数组,您需要返回两个数字的索引,其和等于给定数字。我们可以假设数组只有一个解。您不能两次使用相同的号码。
Пример1: [2, 7, 11, 15], 9
Ответ: [0, 1]
Пример2: [3, 2, 4], 6
Ответ: [1, 2]
如果我们假设数组是有序的(这不是条件!),那么我使用两个指针的方法来解决它:
public int[] twoSum(int[] nums, int target) {
int l = 0, r = nums.length - 1;
while (l < r) {
int currentSum = nums[l] + nums[r];
if (currentSum == target) {
return new int[]{l, r};
} else if (currentSum > target) {
r--;
} else if (currentSum < target) {
l++;
}
}
throw new RuntimeException("the pair is not found");
}
O(n)复杂度。
但是第二个例子有问题:
Пример2: [3, 2, 4], 6
Ответ: [1, 2]
应该给1.2,我有一个异常崩溃。 告诉我如何在数组无序的情况下更正算法?
是的,没有办法解决。要么排序,要么使用另一种算法——在最简单的情况下,用二次时间的两个循环,或者使用哈希表,那么时间是线性的,但是内存是 O(n)
如果不考虑排序,那么最简单的解决方案是不使用额外的数据结构,检查嵌套循环:
是否可以使用哈希表的解决方案(如果输入数组包含重复项,则修复):
测试:
感谢HashMap提示!这是最终正确的决定(系统接受它):