제목 설명
정수 배열 nums 및 목표 값 목표를 감안하고, 배열의 두 정수의 목표 값을 식별하고 그 배열 첨자로 돌아 부탁드립니다. 각 입력이 하나의 답에 해당하는 것으로 가정 할 수 있습니다. 그러나 같은 배열 요소를 다시 사용할 수 없습니다.
예
소정의 nums = 2, 7, 11 , 15, 목표 = 9 nums가 [0] + nums [1 때문 = 2 + 7 = 9 반환 [0, 1]
아이디어 분석
- 솔루션은 폭력 일 수있다
- 특성 맵은 어레이, 메모리 소자의 해시 테이블을 통해 자바 해시 테이블 세트를 이용하고, 동시에 (목표 값 - 현재 요소)를 판정 할 수있는 결과, 해쉬 테이블의 해쉬 테이블 경우 획득 여부를 이 두 첨자가 반환됩니다.
- 방법은 자신의 해시 테이블, 배열의 직접 사용을 달성했다.
자바 코드
public class TOP001 {
public int[] twoSum(int[] nums, int target) {
return Solution3(nums, target);
}
/**
* 解法一:暴力解法
* @param nums
* @param target
* @return
*/
public int[] Solution1(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
/**
* 解法二: 这里利用了java集合中map 哈希表的特性,遍历数组,将元素存入哈希表中, 并同时判断(目标值-当前元素)得到的结果是否在哈希表中,
* 如果在哈希表中则返回这两个下标,
*
* @param nums
* @param target
* @return
*/
public int[] Solution2(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
int targetResult = target - nums[i];
if (map.get(nums[i]) != null && nums[i] * 2 == target) {
//此处针对于 2 +2 =4 4+4=8 这种 存在重复的情况,且重复的加起来正好是target
return new int[] { map.get(targetResult), i };
}
if (map.containsKey(targetResult)) {
return new int[] { map.get(targetResult), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
/**
* 解法三:
* 利用手动哈希的方法,和解法二思路相同
* @param nums
* @param target
* @return
*/
public static int[] Solution3(int[] nums, int target) {
int indexArrayMax = 2047;
int[] indexArrays = new int[indexArrayMax + 1];
for (int i = 0; i < nums.length; i++) {
int diff = target - nums[i];
int index = diff & indexArrayMax;
if (indexArrays[index] != 0) {
return new int[] { indexArrays[index] - 1, i };
}
indexArrays[nums[i] & indexArrayMax] = i + 1;
}
throw new IllegalArgumentException("No two sum value");
}
}