每日一题一一LeetCode1. 两数之和 - 力扣(LeetCode)
每日一题一一LeetCode1. 两数之和 - 力扣(LeetCode)
1. 两数之和 - 力扣(LeetCode)
本题的要求是给你一个数组,然后让你从中找出两个值,他们的和为target,然后返回这两个数的下标
暴力版本:
直接双层遍历,取两个不同的数组中的元素相加为target,直接返回它的下标。
C++版本:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i,j;
for(i=0;i<nums.size()-1;i++){
for(j=i+1;j<nums.size();j++){
if(nums[i]+nums[j]==target){
return {i,j};
}
}
}
return {i,j};
}
};
Java版本:
class Solution {
public int[] twoSum(int[] nums, int target) {
int i,j;
int[] res = new int[2];
for(i=0;i<nums.length-1;i++){
for(j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
res[0]=i;
res[1]=j;
return res;
}
}
}
return res;
}
}
优化版本:
我们可以创建一个Hash表,遍历nums数组,每次询问Hash表中是否存在(target-nums[i]),如果存在,直接返回下标值即可。如果不存在就当前元素为键,其对应的下标为值放入哈希表中。
C++版本
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> map;
vector<int> res;
for(int i=0;i<nums.size();i++){
if(map.find(target-nums[i])!=map.end()){
res.push_back(i);
res.push_back(map[target-nums[i]]);
return res;
}
map[nums[i]]=i;
}
return res;
}
};
java版本
import java.util.Arrays;
import java.util.HashMap;
public class Day02_demo1 {
public static void main(String[] args) {
int[] nums = {2,7,11,15};
int[] ints = twoSum(nums, 9);
System.out.println(Arrays.toString(ints));
}
public static int[] twoSum(int[] nums, int target){
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if(map.containsKey(target-nums[i])){
return new int[] {map.get(target-nums[i]),i};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException();
}
}