IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【力扣Top100系列】—— 两数之和问题 -> 正文阅读

[数据结构与算法]【力扣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];
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:22:01  更:2022-03-06 13:22:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/30 6:02:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码