数组中求两数之和,两个数的下标不能相等

题目描述:
给定一个整数数组num,从数组中找出两个数满足相加之和等于目标数target,假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素,返回两数的下标值,以数组的形式返回

可以采用两种方法:
①暴力算法,i从第一个数值开始遍历,j从第二个数值开始遍历,两个数值相加,检测两者的值是否为目标值target,两个for循环嵌套。
②利用一个map存放数组中的所有数值,遍历数组中的元素,检测target-num[i]是否在map中存在l,在把对应下标放入数组中需要判断,二者是否相等,如果不相等则放入。

代码:

package 无序数组;

/**
 * @author:MrQ
 * @date 2021/7/30-9:15
 */

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;



/**
 * 求数组的两数之和
 * 给定一个数值target
 */
public class main {
    public static void main(String[] args) {
        int[] result = solution(new int[]{1, 2, 3, 4, 5, 6}, 10);
        if (result==null){
            System.out.println("未找到对应的下标");
        }else {
            System.out.println(result[0]);
            System.out.println(result[1]);
        }
        System.out.println("-------------------------------------------------------------");
        int[] result01 = solution01(new int[]{1, 2, 3, 4, 5, 6}, 12);
        if (result01 == null){
            System.out.println("未找到对应的下标");
        }else {
            System.out.println(result01[0]);
            System.out.println(result01[1]);
        }
    }

    /**
     * 使用暴力算法破解
     * i从第一个数开始遍历,j从第二个数开始遍历
     * 访问i,j 对应的数值,然后后相加,如果二者等于目标值target,那么就把i,j放入到result数组中。
     * @param num
     * @return
     */
    public static int[] solution(int num[],int target){
        int[] result = new int[2];
        for (int i=0;i<num.length;i++){
            for (int j=i+1;j<num.length;j++){
                if (num[i] + num[j] == target){
                    result[0] = i;
                    result[1] = j;
                    return result;
                }
            }
        }
        return null;
    }

    /**
     * 我们不需要多次遍历一个数组
     * 有了一个target,通过遍历一次数组,我们就可以得出答案
     * 首先,先把数组放入到一个Map中
     * 然后遍历数组,用target-num[i]检测其值是否存在于map中,如果存在则返回两者对应的下标
     * 否则放回null
     * @param num
     * @param target
     * @return
     */
    public static int[] solution01(int []num,int target){
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for (int i=0;i<num.length;i++){
            //把数组中的值放入到map中
            map.put(num[i],i);
        }
        for (int i=0;i<num.length;i++){
            int result = target - num[i];
            if (map.containsKey(result)) {
                if (map.get(result) !=  i){
                    return new int[]{i, map.get(result)};
                }
            }
        }
        return null;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值