NC61.两数之和(map及优化解法)

23 篇文章 1 订阅
5 篇文章 0 订阅

两数之和

问题描述

题目描述

给出一个整数数组,请在数组中找出两个加起来等于目标值的数,

你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的

假设给出的数组中只存在唯一解

例如:

给出的数组为 {20, 70, 110, 150},目标值为90
输出 index1=1, index2=2

输入

[3,2,4],6

返回值

[2,3]

解题思路

有两种解法:

第一种就是使用两重for循环暴力匹配。复杂度为n的平方。

第二种就是使用map记录下对应元素的下标,再去匹配,匹配成功,获得下标即可。

但是可以做出优化,不需要完全将所有元素都存入map中,而是需要的时候再存。找到答案返回即可。最差时的效率,就是将所有元素及下标提前放入map中。

Java代码

解法一:

import java.util.*;


public class Solution {
    /**
     * 
     * @param numbers int整型一维数组 
     * @param target int整型 
     * @return int整型一维数组
     */
    public int[] twoSum (int[] numbers, int target) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<numbers.length;i++){
            map.put(numbers[i],i);
        }
        
       int [] res = new int [2];
       for(int i=0;i<numbers.length;i++){
           if(map.containsKey(target-numbers[i]) && map.get(target-numbers[i])!=i){
               res[0] = i+1;
               res[1] = map.get(target-numbers[i])+1;
               break;
           }
       }
        return res;
    }
}

解法二:

import java.util.*;


public class Solution {
    /**
     * 
     * @param numbers int整型一维数组 
     * @param target int整型 
     * @return int整型一维数组
     */
    public int[] twoSum (int[] numbers, int target) {
        HashMap<Integer,Integer> map = new HashMap<>();
//         for(int i=0;i<numbers.length;i++){
//             map.put(numbers[i],i);
//         }
        int [] res = new int [2];
       for(int i=0;i<numbers.length;i++){
           int tmp = target-numbers[i];
           if(map.containsKey(tmp) && map.get(tmp)!=i){
               res[0] = map.get(target-numbers[i])+1;
               res[1] = i+1;
               break;
           }else{
               map.put(numbers[i],i);
           }
       }
        return res;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值