每日一题一一LeetCode1. 两数之和 - 力扣(LeetCode)
leetcode.cn/problems/two-sum/description/?envType=study-plan-v2&envId=top-100-liked" rel="nofollow">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();}
}