leetcode第一题
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
两数之和:
1.解法一:暴力法(时间复杂度O() )
通过两层for循环遍历数组,找到两数相加和为目标值的数,取出下标,放入新数组,并返回,若为找到,则抛出异常
class Solution {
public int[] twoSum(int[] nums, int target) {
int []ans=new int[2];
for(int i=0;i<nums.length;i++){
for(int j=(i+1);j<nums.length;j++){
if(nums[i]+nums[j]==target){
ans[0]=i;
ans[1]=j;
return ans;
}
}
}
return ans;
}
}
2.解法二:哈希表一次遍历(时间复杂度O())
创建一个哈希表,遍历数组,将数组的每个值作为key,值对应的下标记为value。再次遍历数组,sub记为目标值target减去nums[i]的差值,判断哈希表中是否存在和sub相等的key,并且key值对应的value不能为当前num[i]的下标,若找到结果,则返回新数组,若未找到,则抛出异常。
class Solution {
public static int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int sub = target - nums[i];
if (map.containsKey(sub) && map.get(sub) != i) {
return new int[]{i,map.get(sub)};
}
}
throw new IllegalArgumentException("没有结果");
}
}
哈希表一次遍历优化操作
只遍历一次数组,直接先判断哈希表中是否存在对应的key,若不存在,则将key和value存入哈希表中,若存在,则直接返回结果
class Solution {
public static int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int sub = target - nums[i];
if (map.containsKey(sub) && map.get(sub) != i) {
return new int[]{i,map.get(sub)};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException("没有结果");
}
}