题目链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
算法思想:
法一(暴力解法):
使用两层for循环进行遍历,外层for循环用来遍历整个数组(使用 i 来标记下标),内层for循环用来标记从 i 下标之后的每一个数与 i 下标对应的数相加是否等于 target
public int[] twoSum(int[] nums, int target) {
for(int i = 0;i < nums.length;i++) {
for(int j = i+1;j < nums.length;j++) {
int ret1 = nums[i];
int ret2 = nums[j];
if(ret1 + ret2 == target) {
return new int[]{i,j};
}
}
}
//未找到匹配的返回 [0,0]
return new int[2];
}
法二(哈希表):
遍历两次数组,第一次遍历数组是为了进行元素的存储(使用一个哈希表存储数组中每个元素及其下标),第二次遍历数组是为了寻找哈希表中是否存在target-nums[i]对应的元素(因为哈希表中存储的是nums[i],所以为了寻找是否有两个值相加等于target时需要使用target-nums[i]),需要注意的是防止相同下标下的元素相加等于target,需要单独判断所找元素的下标和当前位置的下标是否不相同(例如:target=6,nums[0]=3,第二次遍历数组的时候target-nums[0]=3相加刚好等于6,但是不满足题目条件,必须是两个不同下标下的数才符合要求)
public static int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
int j = 0;
for (j = 0; j < nums.length; j++) {
int ret = target - nums[j];
if (map.containsKey(ret) && map.get(ret) != j) {
return new int[]{map.get(ret), j};
}
}
return new int[2];
}