[LeetCode]1.Two Sum 两数之和(Java)
原题地址:
题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
解答方法:
1.暴力方法:
遍历所有数的组合使其和等于target
时间复杂度是O(n^2)
代码如下:
1 class Solution {
2 public int[] twoSum(int[] nums, int target) {
3 int ans[] = new int[2];
4 for(int i = 0; i< nums.length; i++){
5 for(int j = i + 1; j < nums.length; j++){
6 if(nums[i] + nums[j] == target){
7 ans[0] = i;
8 ans[1] = j;
9 }
10 }
11 }
12 return ans;
13 }
14 }
2.排序+双指针:
先将数组进行排序,然后通过双指针进行加和与target对比大小。
算法的时间复杂度是O(nlogn+n)=O(nlogn)
代码如下:
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 int m=0, n=0, k, board=0; 4 int[] res= new int[2]; 5 int[] tmpl=new int[nums.length]; 6 System.arraycopy(nums,0,tmpl,0,nums.length); 7 Arrays.sort(nums); 8 for(int i=0, j=nums.length-1; i<j;){ 9 if(nums[i]+nums[j]<target){ 10 i++; 11 } 12 else if(nums[i]+nums[j]>target){ 13 j--; 14 } 15 else if(nums[i]+nums[j]==target){ 16 m=i; 17 n=j; 18 break; 19 } 20 } 21 for(k=0; k){ 22 if(tmpl[k] == nums[m]){ 23 res[0]=k; 24 break; 25 } 26 } 27 for(int i=0; i){ 28 if(tmpl[i] == nums[n]&&i!=k){ 29 res[1]=i; 30 break; 31 } 32 } 33 return res; 34 } 35 }
3.HashMap:
先将数组存储在一个哈希表中,建立数字和其坐标位置之间的映射。在通过遍历数组,用target减去该数字,就得到了要在哈希表中查找的数字。最后记录下这两个数字的下标输出即可。
时间复杂度为O(n),同时空间复杂度也是O(n)
代码如下:
1 class Solution {
2 public int[] twoSum(int[] nums, int target) {
3 HashMap m = new HashMap();
4 int res[] = new int[2];
5 for(int i = 0; i < nums.length; i++){
6 m.put(nums[i], i);
7 }
8 for(int i = 0; i < nums.length; i++){
9 int t = target - nums[i];
10 if(m.containsKey(t) && m.get(t) != i){
11 res[1] = i;
12 res[0] = m.get(t);
13 }
14 }
15 return res;
16 }
17 }
?