[LeetCode]1.Two Sum 两数之和(Java)

原题地址two-sum

题目描述:

给定一个整数数组 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<nums.length; k++){
22             if(tmpl[k] == nums[m]){
23                 res[0]=k;
24                 break;
25             }
26         }
27         for(int i=0; i<nums.length; 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<Integer, Integer> m = new HashMap<Integer,Integer>();
 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 }


posted @ 2021-10-13 14:43  ftfty  阅读(44)  评论(0编辑  收藏  举报