解决思路1
暴力法解决问题,双重循环来找到数组中两数之和为target的数字。
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
for (int i = 0; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
if(nums[i]+nums[j]==target)
return new int[]{i,j};
}
}
throw new IllegalArgumentException("no solution");
}
解决思路2
使用hash表的Key-value结构,保存数字—>索引的关系。根据目标数字来到hash表中查找。先存入hash表,然后进行查询。
//2.使用Hash表
public int[] twoSum1(int[] nums, int target) {
//新建hashmap
HashMap<Integer, Integer> map = new HashMap<>();
//1.将所有数据保存到map中
for (int i = 0; i < nums.length; i++) {
map.put(nums[i],i);
}
//再次遍历数组,寻找到每个数对应的数
for (int i = 0; i < nums.length; i++) {
int targetNum = target-nums[i];
if(map.containsKey(targetNum)&& map.get(targetNum)!=i)
return new int[]{i,map.get(targetNum)};
}
throw new IllegalArgumentException("no solution");
}
解决思路3
边存到hash表中,边在表中进行查找操作。
//3.改进的hashmap
public int[] twoSum2(int[] nums, int target) {
//新建hashmap
HashMap<Integer, Integer> map = new HashMap<>();
//1.将所有数据保存到map中(必须先查询,后存储才可以)
for (int i = 0; i < nums.length; i++) {
int targetNum = target-nums[i];
if(map.containsKey(targetNum))
return new int[]{map.get(targetNum),i};
map.put(nums[i],i);
}
throw new IllegalArgumentException("no solution");
}