1.暴力
暴力算法时间复杂度O(n²),空间复杂度O(1)
public static int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i; j < nums.length; j++) {
if(nums[i]+nums[j]==target) {
return new int[]{nums[i],nums[j]};
}
}
}
return null;
}
2.排序+双指针法
public static int[] twoSum1(int[] nums, int target) {
Arrays.sort(nums);
int left=0;
int right=nums.length-1;
while (left<right) {
if(nums[left]+nums[right]>target) {
right--;
}else if (nums[left]+nums[right]<target) {
left++;
}else {
return new int[]{nums[left],nums[right]};
}
}
return null;
}
3、利用map数组构造映射,遍历nums[i]时,看target-nums[i]是否存在hash表中即可
public static int[] twoSum2(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if(map.containsKey(target-nums[i])) {
return new int[]{nums[map.get(target-nums[i])],nums[i]};
}
map.put(nums[i],i);
}
return null;
}
进阶题目:不重复打印排序数组中相加和为给定值的所有二元组
package bytetens;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
/**
* @author :Administrator.
* @date :2020/8/5 0005
* @time:17:26
*/
public class 不重复打印排序数组中相加和为给定值的所有二元组 {
}
class Demo1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int target=sc.nextInt();
int[] nums=new int[n];
for (int i = 0; i < n; i++) {
nums[i]=sc.nextInt();
}
// Map<Integer,Integer> map= new HashMap<>();
// Map<Integer,Integer> map1=new TreeMap<>();
// for (int i = 0; i < nums.length; i++) {
// if (map.containsKey(target-nums[i])) {
// map1.put(target-nums[i],nums[i]);
// }
// map.put(nums[i],i);
// }
// for (Map.Entry<Integer,Integer> e:map1.entrySet()) {
// System.out.println(e.getKey()+" "+e.getValue()+" ");
//
// }
int i=0;
int j=nums.length-1;
while (i<j) {
if (nums[i]+nums[j]<target) {
i++;
}else if (nums[i]+nums[j]>target) {
j--;
}else {
if (i==0||nums[i]!=nums[i-1]||j==nums.length-1) {
System.out.println(nums[i] + " " + nums[j]);
}
i++;
j--;
}
}
}
}