1.两数之和(数组中只有一个答案---无去重问题)

题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

来源:力扣(LeetCode)
链接:两数之和

version-1(菜的安详):

class Solution {
    int[] find = new int[2];
    public int[] twoSum(int[] nums, int target) {                   
                    for(int i = 0; i<nums.length;i++)
                    {
                        for (int j = i+1; j < nums.length; j++) {

                            if ((nums[i] + nums[j]) == target) {
                                find[0]=i;
                                find[1]=j;
                                break;
                            }
                        }
                    }
                   return find;
   }
}

在这里插入图片描述

**version-1心路历程:**我刚开始第一想法就是暴力解法,看到哈希表毫无想法。而且我刚开始还加了个二维数组用来存放所有的相加的可能(MATLAB写多了),然后发现LeetCode提交系统中的测试样本很大时,会报错说我超出了系统内存限制(这很明显是无事生非,显然我们必须尽量避免使用高维数组,占内存)

version-2:Hashmap学习:
(创建一个hashmap容器存放已经判断的数,并用来与新取出的数比较是否有希望和为目标值,没有希望将这个新的数也加入到hashmap中)

具体的实现逻辑:
//先初始化存入第一对键值
//从存放第二对键值时,开始检查容器内的已有键值对–有没有能够与此时打算新加入的键值对–相加成为target的键值
//如果有,则返回相应的键(数组元素值)—值(数组的序号)
//如果没有, 则单纯的存入相应的新的键值对至容器内
//如此循环往复,直到出现target的匹配对,否则直到所有nums数组的元素全部存入map容器中;此时也就相当于:我们最终没有找到一对合适的sumTwo ,最后可以抛出一个错误(我的理解是:因为你一定要返回一个值,你这个方法不是void,所以必须return,如果遍历完所有后,发现不能return一对index时,此时只能你自己先报错告诉用户内没有找到,并终止程序-----throw错误后的程序没法执行。你会发现:如果你的target真的没有找到一对index,你没有throw这个错误,此时相当于你缺少个return语句,系统编译也会报错。

Map类方法1:get(Object key)--------获取相应键的值

Map类方法2: put(K key, V value)------------在容器中存入一对键值

Map类方法3:containsKey(key:)-------键在容器与否(返回boolean值:true or false )
在这里插入图片描述

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int cp=target-nums[i];
            if(map.containsKey(cp)){
                return new int[]{map.get(cp),i};
            }
            map.put(nums[i],i);
        }
        throw new IllegalArgumentException("报错:没有这个组合");
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值