day22--哈希

news2024/12/24 22:03:18

两数之和

哈希表的思想

以空间换时间,这是由于哈希表保存了键值对,其查找复杂度为O(1)。

解题思路为

  1. 定义哈希表hashmap,其存放的键值对为<取值,下标>

  2. 从开始处遍历数组,对于第i个位置,在哈希表中寻找target-nums[i]是否存在,若存在,将两个下标放入数组中返回;若不存在,将其添加至表中,继续遍历

此解法只遍历数组一次,且在哈希表中查找的时间复杂度为O(1),因此总时间复杂度为O(N)

该方法需要构建哈希表,因此空间复杂度为O(N)

#include <vector>
class Solution {
public:
    /**
     * @param numbers int整型vector 
     * @param target int整型 
     * @return int整型vector
     */
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> res;
        if(numbers.size()==0) return res;
        map<int, int> hash;//哈希表<值,下标>
        for(int i=0; i<numbers.size(); i++){
            if(hash[target-numbers[i]]){
                res.push_back(hash[target-numbers[i]]);//找到了,说明该下标在遍历到的数之前(因为仅遍历数组一遍)
                res.push_back(i+1);
                return res;
            }else hash[numbers[i]]=i+1;//下标从1开始
        }
        return res;
    }
};

数组中出现次数超过一半的数字

哈希(时间复杂度:O(n),空间复杂度:O(n))

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int len=numbers.size();
        if(len==0) return -1;
        if(len==1) return numbers[0];
        map<int, int> hash;//哈希表<值,次数>
        for(int i=0;i<len;i++) hash[numbers[i]]++;
        for(int i=0;i<len;i++) {
            if(hash[numbers[i]]>(len/2)) return numbers[i];
        }
        return 0;
    }
};

 候选法(最优解)

假如数组中存在众数,那么众数一定大于数组的长度的一半。
思想:如果两个数不相等,就消去这两个数。最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数

  1. 初始化:候选人cond = -1, 候选人的投票次数cnt = 0
  2. 遍历数组,如果cnt=0, 表示没有候选人,则选取当前数为候选人,++cnt
  3. 否则,如果cnt > 0, 表示有候选人,如果当前数=cond,则++cnt,否则--cnt
  4. 直到数组遍历完毕,最后检查cond是否为众数
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int len=numbers.size();
        int cond=-1, cnt=0;
        for(int i=0;i<len;i++){
            if(cnt==0){
                cond=numbers[i];//选取一个候选数
                cnt++;
            }else{
                if(cond==numbers[i]) cnt++;
                else cnt--;
            }
        }cnt=0;
        for(int i=0;i<len;i++)
            if(cond==numbers[i]) cnt++;
        if(cnt>(len/2)) return cond;
        return 0;
    }
};

数组中只出现一次的两个数字

#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        vector<int> res;
        int len = array.size();
        map<int, int>hash;
        for(int i=0;i<len;i++)  hash[array[i]]++;
        for(int i=0;i<len;i++){
            if(hash[array[i]]==1) res.push_back(array[i]);
        } sort(res.begin(), res.end());//只有两个元素,可忽略不计
        return res;
    }
};

缺失的第一个正整数 

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param nums int整型vector 
     * @return int整型
     */
    int minNumberDisappeared(vector<int>& nums) {
        map<int, int>hash;
        for(int i=0;i<nums.size();i++) hash[nums[i]]++;
        int res = 1;
        while(hash.find(res)!=hash.end()) res++;//哈希表中有res
        //或hash.count(res)的数值只有 0 和 1
        return res; 
    }
};

三数之和 

  • step 1:排除边界特殊情况。
  • step 2:使用sort函数优先对其排序。
  • step 3:得到有序数组后,遍历该数组,对于每个遍历到的元素假设它是三元组中最小的一个,那么另外两个一定在后面。
  • step 4:需要三个数相加为0,则另外两个数相加应该为上述第一个数的相反数.可以利用双指针在剩余的子数组中找有没有这样的数对。双指针指向剩余子数组的首尾,如果二者相加为目标值,那么可以记录,而且二者中间的数字相加可能还会有(注意去重)
  • step 5:如果二者相加大于目标值,说明右指针太大了,那就将其左移缩小,相反如果二者相加小于目标值,说明左指针太小了,将其右移扩大,直到两指针相遇,剩余子数组找完了
#include <vector>
class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        vector<vector<int>>res;
        int len = num.size();
        if(len < 3) return res;
        sort(num.begin(), num.end());
        for(int i=0;i<len-2;i++){
            if(num[i] == num[i-1] && i!=0) continue;
            int j=i+1, k=len-1;
            while(j < k){
                if(num[j] + num[k] + num[i] == 0){
                    res.push_back({num[i], num[j], num[k]});
                    while(k-1>j && num[k]==num[k-1]) k--;//去重
                    while(j+1<k && num[j]==num[j+1]) j++;//去重
                    j++, k--;
                }
                else if(num[j] + num[k] + num[i]>0) k--;
                else j++;
            }
        }
        return res;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【字符串part02】| 28.实现strStr()、459.重复的子字符串

目录 ✿LeetCode28.实现strStr()❀ ✿LeetCode459.重复的子字符串❀ ✿LeetCode28.实现strStr()❀ 链接&#xff1a;28.实现strStr() 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 …

C++ gets函数与strlen函数详解

引言 今天在看y总视频师对下面这串代码颇感兴趣&#xff1a; #include <iostream> #include <string.h> using namespace std; int main() {char s[1000];gets(s);int n strlen(s);for (int i 0; i < n; i){int j i;while (j < n && s[j] ! ){…

【MyBatis】什么是MyBatis?

MyBatis 是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。 说人话就是连接数据库并执行SQL的框架。 文章目录 0 JDBC简介及流程0.1 DriverManager / Connection0.2 ResultSet0.3 PreparedStatement1 SQL注入2 流程 1 MyBatis通过注解执行SQL语句1.1 MyBatis入门&…

简要介绍 | 神经辐射场(NeRF):原理、挑战与未来展望

神经辐射场(NeRF)&#xff1a;原理、挑战与未来展望 1. 背景介绍 随着深度学习和计算机图形学的不断发展&#xff0c;人工智能和图形学领域的交叉研究越来越多地受到关注。神经辐射场(NeRF)是其中一个极具潜力的研究方向&#xff0c;它结合了计算机图形学和深度学习&#xff0…

STM32驱动INMP441麦克风实现左右通道声音采集

一、参考原理图 1、INMP441 2、STM32 注意INMP441的第4引脚&#xff0c;用来选择左声道还是右声道。 二、代码生成 代码使用cubemx生成 1、iis设置 2、DMA设置 3、生成代码 三、代码修改 1、首先定义一个数组 #define BUFFER_SIZE (4)static uint32_t simpleBuf[BUFFER_S…

金属表面缺陷检测类的实践项目

【说明】&#xff1a;下面仅以Pytorch CNN Transfer Learning: Image Classifier 关于金属表面缺陷检测类的实践项目为例介绍如何创建虚拟环境以及在JuypterLab中使用对应的内核 项目已开源在https://github.com/astudent2020/Metal_Surface_Defects 提供数据集及相关代码 …

【IMDB】IMDB数据集导入PostgreSQL和join order benchmark(JOB)查询生成

目录 简述join order benchmark(JOB)查询获取IMDB导入数据到PG 简述 IMDB数据库是一个很大的&#xff0c;被广泛使用的电影&#xff0c;电视节目和演员信息的数据库&#xff0c;它包括了有关电影、电视节目、演员、制作公司、编剧、导演等信息。IMDB数据集可以为电影评论、分类…

【源码分析】Mybatis 的配置解析过程

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

Hadoop(CentOS)安装及MapReduce实现数据去重

Hadoop&#xff08;CentOS&#xff09;安装及MapReduce实现数据去重 1. JDK安装 1.1 资源下载&#xff1a; 下载地址&#xff1a;https://pan.quark.cn/s/17d7266205f9 hadoop的安装 包 java jdk安装包 eclipse连接hadoop工具 所学其他工具可自行在官网下载 centos下载地…

Verilog 高级知识点

目录 Verilog 高级知识点 1、阻塞赋值&#xff08;Blocking&#xff09; 2、非阻塞赋值&#xff08;Non-Blocking&#xff09; 3 、assign 和 always 区别 4、什么是 latch Verilog 高级知识点 本节给大家介绍一些高级的知识点。高级知识点包括阻塞赋值和非阻塞赋值、assi…

合宙Air724UG Cat.1模块硬件设计指南--ADC接口

ADC接口 简介 ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。 合宙Cat.1模块ADC接口主要用来检测模拟电压信号量&#xff0c;用于电池电压检测&#xff0c;温湿度检测&#xff0c;TDS检测等应用。 特性 ADC精度&#…

华为OD机试真题 JavaScript 实现【素数之积】【2022Q4 100分】

一、题目描述 RSA加密算法在网络安全世界中无处不在&#xff0c;它利用了极大整数因数分解的困难度&#xff0c;数据越大&#xff0c;安全系数越高。 给定一个32位正整数&#xff0c;请对其进行因数分解&#xff0c;找出是哪两个素数的乘积。 二、输入描述 一个正整数num …

【自动文摘】BART实现finetune及evaluate

文章目录 BART介绍下游任务 fine tune BART介绍 我最近在看自动文摘相关的预训练模型&#xff0c;BART模型是2019-2020左右提出来的&#xff0c;首先介绍下它的基本情况。 论文&#xff1a;https://arxiv.org/abs/1910.13461 github&#xff1a; fairseq例子&#xff1a;http…

Efficient Global 2D-3D Matching for Camera Localization in a Large-Scale 3D Map

文章目录 Efficient Global 2D-3D Matching for Camera Localization in a Large-Scale 3D Map1. 相似源码choose_solution.pyeight_point.pyepipolar_match.py Efficient Global 2D-3D Matching for Camera Localization in a Large-Scale 3D Map 1. 相似源码 由于paper并没…

ChatGPT带火的提示工程师,构造自己的提示语

ChatGPT是一个大语言模型&#xff0c;学过全球几乎公开的大部分有效知识库&#xff0c;它什么都懂。 ChatGPT的风靡&#xff0c;爆火了一个年薪百万的提示工程师这个新就业岗位。 提示工程师&#xff0c;也就是AI训练师&#xff0c;即通过与AI交互写出相关提示&#xff0c;以帮…

Spring Boot进阶(48):SpringBoot之集成WebSocket及使用说明 | 超级详细,建议收藏

1. 前言&#x1f525; 对于很多小伙伴来说&#xff0c;项目现在都普遍前后端分离&#xff0c;各干各的事儿&#xff0c;在前后端进行服务调用才会有大面积的碰头&#xff0c;后端接口数据格式发生变更要通知前端&#xff0c;相反&#xff0c;前端有变化要告诉后端&#xff0c;这…

【这小文章绝了!】一文看穿,MATLAB | 数组与矩阵超详细入门进阶必须看

目录 介绍 一、数组的创建和操作 通过 : 创建一维数组 通过logspace函数创建一维数组 通过linspace函数创建一维数组 二、数组的运算 数组的关系运算 数组的逻辑运算 三、矩阵 矩阵的构造 矩阵的下标引用 矩阵大小 四、矩阵元素的运算 矩阵的差分 矩阵运算 矩阵…

Spring Boot进阶(50):Spring Boot如何全局统一处理异常?| 超级详细,建议收藏

1. 前言&#x1f525; 今天和大家讨论的是Spring Boot如何统一处理异常。这里先说一下我们为什么需要全局统一处理异常&#xff1f;其实理由很简单&#xff0c;因为程序在运行的过程中&#xff0c;不可避免会产生各种各样的错误。比如说用户传过来的参数不正确&#xff0c;无法…

4端到端协议-4.2【实验】【计算机网络】

4端到端协议-4.2【实验】【计算机网络】 前言推荐4端到端协议4.2 TCP协议流捕获与TCP协议分析实验目的实验内容及实验环境实验原理实验过程实验过程演示 4.2.1实验章节测验一.单选题&#xff08;共5题,25.0分&#xff09;二.阅读理解&#xff08;共1题,70.0分&#xff09;三.填…

xxl-job核心源码解析

xxl-job源码解析 如何自研一个xxljob 注册服务调度服务RPC组件(基建&#xff0c;底层严重依赖)日志服务告警服务 系统架构 执行流程 各大调度中心对比 1&#xff09;服务端启动流程 首先找到配置类 XxlJobAdminConfig 可以发现该类实现 InitializingBean接口&#xff0c;…