算法之数组中两个数字,相加等于某特定值

数组中任意两个数,相加=特定数值

本文转载自: 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值