【力扣Top100系列】—— 两数之和问题

两数加和
概述:
这系列文章并不是给出很厉害的解决问题的方法,大多是自己再解决问题上的一些思考,以及涉及的知识点。

1.对于每道题,要有一个思考的过程
需求分析:要得到两个数相加为目标值的索引

拟定的解决方法:

(1) 穷举法:把所有可能的情况都列出来

特殊情况有哪些:可能没有符合条件的;

数据的边界范围:因为数组作为参数传入,所以不用考虑设置一个数组了,这里和Acwing不太一样

[为了方便观看,我将代码放在思路这里]

class Solution {
#define MAX 10005
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        
        //记录数组的长度
        int len = nums.size();

        //采用双层for循环
        for(int i = 0; i < len; i++ ){
            for(int j = i + 1; j < len; j++){
                if(nums[i] + nums[j] == target){
                    return {i ,j};
                }

            }
        }
        return {};
    }
};

(2)参考答案了解到的高效解决方案:
哈希表法:哈希也叫散列,体现的是存储的值与索引之间是一种对应的关系,这种关系通过采用特别的方法来建立
那 么 要 怎 么 应 用 哈 希 表 呢 ? 以 及 如 何 应 用 呢 ? ( 给 出 了 单 独 的 版 块 ) / \color{pink}{那么要怎么应用哈希表呢?以及如何应用呢?(给出了单独的版块)}/ /

class Solution {
#define MAX 10005
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        
    //记录数组的长度
   int len = nums.size();
    //创建一个哈希表
   unordered_map<int, int> countNum;

    for(int i = 0; i < len; i++){
        if(countNum.find(target - nums[i]) != countNum.end()){
            return {i, countNum.find(target - nums[i]) -> second};
        }

        //将当前记录插入到哈希表中,主要value为索引
        countNum[nums[i]] = i;
    }
        return {};
    }
};
对于解决问题过程中存在的问题:

(1)输出的是一个数组,那么这个return 的是什么呢
(2)我将用什么来保存这个找到的值呢
我想过用数组保存,但是当满足条件的值出现时,会有两个索引,不能同时保存两个索引

查询的问题:

如何返回一个数组: 不能直接返回数组,通过指针操作来完成

参考答案获得的知识:

(1)对于索引的返回并不用保存,直接添加大括号即可 return {i, j}
(2)针对于没有满足条件的答案,通过返回 空的大括号来完成 return {}
(3)题目中有一个细节问题没有捕捉到:“数组中找出和为目标值的那两个整数” ——》 高亮部分需要注意

重点来了——哈希板块

1.对于哈希表我们的确学过,但是只是基于理论层面的,学校并没有教给我们怎么去使用。
2.针对当前这题,对于涉及的方法与思想都让我来好好学习一下吧?

(1)unordered_map<key, value> Map_name

此处的key和value填的都是对应的数据类型,通过这条语句可以完成哈希表的创建

(2)map.find(num)

用find函数定位num出现的位置,如果出现了,就会返回数据出现位置的迭代器;如果没出现,返回的迭代器就会等于end函数返回的迭代器

(3)map.end()

这个函数返回的也是一个迭代器,不过返回的是最后一个映射旁边的迭代器,一般与find函数组合使用,代表哈希表中不存在这样的数据

(4)有一个很重要的问题:

最开始哈希表里面是没有数据的,第一次利用find函数进行查找时,返回的迭代器一定为map.end()返回的迭代器,因为找到的两个数的和,此时就以1,3为例,找 4 -1 时,没有找到三,就要吧1保存到哈希表中,当找 4 - 3时,找到了一,所以就解决了问题

【因为XiaoZhao是主Java的为了更好的学习,在文章末尾添加Java的代码】

暴力枚举法

[因为C++和Java之间是存在一定差异的,所以我再给出不同部分替换方法的解释]

  • 对于返回一个空/非空的数组时(原来未定义),是要new一个数组的
  • new int [] {ba,la} 这里面的ba la 就是这个数组的内容
class Solution {
    public int[] twoSum(int[] nums, int target) {
        //记录数组的大小
        int len = nums.length;

        //双层for循环
        for(int i = 0; i < len; i++){
            for(int j = i + 1; j < len; j++){
                if(nums[i] + nums[j] == target){
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }
}

哈希表

  • 创建哈希表的方式不同:Map<keytype,valuetype> mapname = new HashMap<keytype,valuetype>();
  • 对于查看哈希表中是否包含这个key的方式不同:
    map.containsKey( )
  • 获取value的方式不同: map.get(key)
class Solution {
    public int[] twoSum(int[] nums, int target) {
        //记录数组的大小
        int len = nums.length;
    //创建一个哈希表
    Map <Integer, Integer> countNum = new HashMap<Integer, Integer>();

    for(int i = 0; i < len; i++){
        if(countNum.containsKey(target - nums[i])){
            return new int[]{i, countNum.get(target - nums[i])};
        }
        countNum.put(nums[i], i);
    }
        return new int[0];
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bow.贾斯汀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值