本文转载自: https://blog.youkuaiyun.com/sundy_sc/article/details/107484258.
方法一
1、拿目标值减去循环中的某个数组的元素值。
2、如果元素符合条件,就将下标放入到Map集合中。
public static Map<Integer,Integer> method1(int[] nums, int sum){
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<nums.length-1;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[j]== sum - nums[i]){
map.put(i,j);
}
}
}
return map;
}
测试:
int[] nums={54,51,99,81,1,30,70};
int sum = 100;
Map<Integer,Integer> maps1 = method1(nums,sum);
for(Map.Entry<Integer,Integer> entry:maps1.entrySet()){
System.out.println(nums[entry.getKey()]+" + "+nums[entry.getValue()]+" = "+sum);
}
输出结果:
99 + 1 = 100
30 + 70 = 100
方法二
1、首先对原数组进行排序,成为递增数组;
2、对排序后的数组头部i [0]和数组尾部j [n-1]相加,判断是否等于目标值,等于目标值则打印,然后执行3,否则执行2;
3、如果相加小于目标值,则i++,j不变。如果相加大于目标值,则i不变,j–;继续执行1;
4、数组下标i++,j–,继续执行1;
5、当i==j,退出程序。
public static Map<Integer,Integer> method2(int[] nums, int sum){
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0,j=nums.length-1;i!=j;){
int result = nums[i]+nums[j];
if(result == sum){
map.put(i,j);
i++;
j--;
}else if(result < sum){
i++;
}else if(result > sum){
j--;
}
}
return map;
}
//数组排序
public static void sort(int[] d){
int temp =0;
for(int i=0;i<d.length;i++){
for(int j = i;j<d.length;j++){
if(d[i]>d[j]){
temp = d[i];
d[i] = d[j];
d[j] = temp;
}
}
}
}
测试:
sort(nums);
Map<Integer,Integer> maps2 = method2(nums,sum);
for(Map.Entry<Integer,Integer> entry:maps2.entrySet()){
System.out.println(nums[entry.getKey()]+" + "+nums[entry.getValue()]+" = "+sum);
}
输出结果:
1 + 99 = 100
30 + 70 = 100
方法三
1、把数值作为 key,它的下标作为 value
2、遍历数组,判断 map 是否含有这个目标值-当前数值
3、有直接返回,没有的话放到map里面
以下只会返回一组 符合条件的数据
public static int[] method3(int[]nums,int sum){
Map<Integer,Integer> map = new HashMap<Integer, Integer>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(sum-nums[i])){
return new int[] {map.get(sum-nums[i]),i};
}
map.put(nums[i],i);
}
return new int[]{0,0};
}
测试:
int[] results = method3(nums, sum);
for(int i:results){
System.out.println(nums[i]);
}
输出结果:
30
70
上述方法如果想要实现输出所有符合条件的数据,可改造如下
public static Integer[] method4(int[]nums,int sum){
Map<Integer,Integer> map = new HashMap<Integer, Integer>();
List<Integer> list = new ArrayList<Integer>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(sum-nums[i])){
list.add(map.get(sum-nums[i]));
list.add(i);
}
map.put(nums[i],i);
}
// Object数组转为int类型数组
Integer[] result =Arrays.copyOfRange(list.toArray(),0,list.size(),Integer[].class);
return result;
}
Map.containsKey() 方法判断 Map 集合对象中是否包含指定的键名。如果 Map 集合中包含指定的键名,则返回 true,否则返回 false
测试:
Integer[] res = method4(nums, sum);
for(int i=0;i<res.length;i++){
//将符合条件的数据分组打印出来
if((i+1)%2==0){
System.out.println(nums[res[i-1]]+"----"+nums[res[i]]);
}
}
输出结果:
30----70
1----99
方法四
1、将数组排序
2、用两个指向数组的指针,一个从前往后扫描,一个从后往前扫描,记为i和j
3、如果 数组的i下标对应的值+数组的j下标对应的值 < 目标值,则将i向前移动
4、如果数组的i下标对应的值+数组的j下标对应的值 > 目标值,则j向后移动
5、如果数组的i下标对应的值+数组的j下标对应的值=目标值,将对应i,j添加到List集合中
public static Integer[] method5(int[] nums,int sum){
int i=0;
int j=nums.length-1;
int result=0;
List<Integer> list = new ArrayList<Integer>();
while (i<j){
result = nums[i]+nums[j];
if(result==sum){
list.add(i);
list.add(j);
i++;
j--;
}else if(result<sum){
i++;
}else if(result>sum){
j--;
}
}
return Arrays.copyOfRange(list.toArray(),0,list.size(),Integer[].class);
}
测试:
sort(nums);
Integer[] res1 = method5(nums, sum);
for(int i=0;i<res.length;i++){
//将符合条件的数据分组打印出来
if((i+1)%2==0){
System.out.println(nums[res[i-1]]+"----"+nums[res[i]]);
}
}
输出结果:
30----70
1----99