两数之和
- 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
- 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
- 你可以按任意顺序返回答案
哈希解法
- 思路:
- 遍历nums数组 i就是当前的目标值,然后每次都要查看一下map里边是否包含targetSum值
- 如果存在 则根据 targetSum取值返回
- 如果不存在的话,就把num和i放到map里边,继续循环遍历直到找到为止,如果都没有找到的情况下 则抛异常 没有O(n)2 和解
public static int[] towSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
int i=0;
for (int num : nums) {
int targetSum = target - num;
if (map.containsKey(targetSum)) {
return new int[]{map.get(targetSum), i};
}
map.put(num, i);
i++;
}
throw new IllegalArgumentException("没有O(n)2 和解");
}
双指针
- 思路
- 将num数组copy一份integers 然后将integers排个序,设置两个指针, 将左右两个指针的和相加 然后做一个对比
- 如果相等的话,再根据两个指针找到相对应的数据 证明该数据符合合O(n)2 和解
- 如果总数 大于目标数组的情况下 右指针向左移动
- 如果总数 小于目标左指针向右移动
- 如果都不符合则该目标值 不是合O(n)2 和解
public int[] towSum(int[] nums, int target) {
int[] integers = Arrays.copyOf(nums, nums.length);
Arrays.sort(integers);
int left = 0;
int right = integers.length - 1;
while (left < right) {
int sum = integers[left] + integers[right];
if (sum == target) {
int leftIndex = -1;
int rightIndex = -1;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == integers[left] && leftIndex == -1) {
leftIndex = i;
} else if (nums[i] == integers[right] && rightIndex == -1) {
rightIndex = i;
}
}
return new int[]{leftIndex, rightIndex};
} else if (sum > target) {
right--;
} else {
left++;
}
}
throw new IllegalArgumentException("没有O(n)2 和解");
}