算法:sum_two两数之和
要求:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
1. 循环解法
自己写的代码:
// 使用两个循环
class Solution{
public int[] twoSum(int[] nums,int target){
int i,j,sum;
int[] value = new int[2];
for(j = 0;j < nums.length;j++){
for(i = j+1;i < nums.legth;i++){
sum = nums[i] + nums[j];
if(sum == target){
value[0] = j;
value[1] = i;
}
}
return value;
}
}
心得:外层循环控制固定一个数,内层循环依次和后面的数相加
**注意:return 的位置,当没有找到对应target的数组下标时value返回0,0这显然是有bug的,我们应该将其return null,在if的循环中返回value。下同 **
2.1 map<key,value>解法
原理:在找到相差数据之前将数据存入map,找到相差数据第一个下标是已经存入map的下标,第二下表是相差的下标。
// Map<key,value>
public int[] twoSumTwice(int[] nums,int target){
Map<Integer,Integer> map = new HashMap<Integer, Integer>();
int[] value = new int[2];
for(int i = 0;i < nums.length;i++){
if(map.get(target-nums[i]) == null ) {
map.put(nums[i], i);
}
else{
value[0] = map.get(target - nums[i]);
value[1] = i;
return value;
}
}
return null;
}
心得:
1.使用map<key,value>,key是数值,value是下标。
2.使用map.get(target-nums[i]) == null,在差值还没找到之前将数据存入map中
3.找到差值是因为之前已经存入map,所以第一个下标为差值的下标
2.2 map<key,value>解法
原理:先将差值及差值对应的下标存入map,当找到差值是在map中时,返回map对应的数组下标,第二下标为这个数据对应的下标。
// Map<key,value>
public int[] twoSumThird(int[] nums,int target){
Map<Integer,Integer> map = new HashMap<Integer, Integer>();
int[] value = new int[2];
for(int i = 0;i < nums.length;i++){
if(map.containsKey(nums[i])){
value[0] = i;
value[1] = map.get(nums[i]);
return value;
}
//key 存的是差值,value存的是差值对应下标
map.put(target-nums[i],i);
}
return null;
}