题目:
序号:1
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
思路:暴力法或者使用哈希表
golang实现:
package main
import "fmt"
// 1.暴力法 遍历数组 查找数组中是否存在和当前遍历到的数temp 的和为target的数 即寻找target - temp
func twoSum1(nums []int, target int) []int {
for i, temp := range nums{
for j := i+1; j < len(nums); j++ {
if nums[j] == target - temp {
return []int{i, j}
}
}
}
return nil
}
// 2.使用哈希表,key为数字,value为index, 每一次将元素插入哈希表之前检查表中是否存在key为target - temp ,
// 如果存在返回key为target - temp 对应的value和当前的index
func twoSum2(nums []int, target int) []int {
numsMap := map[int]int{}
for i, temp := range nums {
if p, ok := numsMap[target-temp]; ok {
return []int{p, i}
}
numsMap[temp] = i
}
return nil
}
func main() {
arr := []int{1, 2, 3, 4}
target := 7
result1 := twoSum1(arr, target)
fmt.Println(result1)
result2 := twoSum2(arr, target)
fmt.Println(result2)
}
Java实现: 仅第第二种方法
public int[] towSum(int[] nums,int target){
HashMap<Integer, Integer> hashMap = new HashMap<>();
if(nums != null && nums.length>0){
for (int i=0;i<nums.length;i++){
//必须先判断map中是否存在和当前数组元素值相同的key,避免target和当前元素的差值等于当前元素,会返回类似[0,0]这样的错误结果
if (hashMap.containsKey(nums[i])){
Integer index = hashMap.get(nums[i]);
int[] indexArr = {index,i};//考虑顺序的话 先存index再存当前元素的下标
return indexArr;
}
hashMap.put(target-nums[i],i);//target和当前元素的差值为key,下标为value,存入map
}
}
return null;
}