本文所有题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html

454.四数相加II

有四个数组,如果要遍历则时间复杂度太大
可以选择分组,a和b一组,c和d一组
这样就可以等同于两个数之和为0的情况了
只需要把a+b的所有可能和放入哈希表,然后c和d的和再找哈希表里能和它们加和等于0的
哈希表使用map,一个表示ab的和,一个表示次数

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {//有四个数组,如果要遍历则时间复杂度太大//则可以选择分组,a和b一组,c和d一组//这样就可以等同于两个数之和为0的情况了//只需要把a+b的所有可能和放入哈希表,然后c和d的和再找哈希表里能和它们加和等于0的//哈希表使用map,一个表示ab的和,一个表示次数unordered_map<int,int> m;for(int i=0;i<nums1.size();i++){for(int j=0;j<nums2.size();j++){m[nums1[i]+nums2[j]]++;}}int count=0;for(int i=0;i<nums3.size();i++){for(int j=0;j<nums4.size();j++){int s=-(nums3[i]+nums4[j]);if(m.find(s)!=m.end()){count+=m[s];}}}return count;}
};

383. 赎金信

本题 和 242.有效的字母异位词 是同样类型的题目,思路都是一样的,使用数组做哈希表

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {//把magazine里的字母存入哈希表//再进行比对,如果有则对应数量-1,如果没有则返回false//最终返回trueint s[26]={0};for(int i=0;i<magazine.size();i++){s[magazine[i]-'a']++;}for(int i=0;i<ransomNote.size();i++){if(s[ransomNote[i]-'a']==0){return false;}s[ransomNote[i]-'a']--;}return true;}
};

15. 三数之和

这题的主要难点在于如何去重,这题应该用双指针,而不是哈希(哈希也可做,但是会比较麻烦

排序+双指针(最优解):

先对数组排序(O(n log n))

固定一个数 nums[i],然后使用双指针在剩余数组中寻找两个数

  • 排序后可以方便地去重

  • 双指针可以将两数之和的时间复杂度从O(n²)降到O(n)

双指针也需要去重,只是由于排序过,略微简单了一点,下面记录去重的思路:
    1. 由于去重指的是不同的结果集不能有重复的三元组
    2. 其中i指针指向a,是固定的,再去找符合条件的b和c,则固定数去重的思路是判断nums[i]是否与上一位也就是nums[i-1]相同。这样可以避免产生重复的三元组
    3. 接着是找到解之和的去重:
           找到解之和,我们去看后面有无与b、c重复的元素,对于b来说是后面的元素(直到找到与当前位置不一样的数),对于c是前面的元素(直到找到与当前位置不一样的数)

 

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end());//先排序for(int i=0;i<nums.size();i++){if(nums[i]>0) break;if(i>0 && nums[i]==nums[i-1])continue;int left=i+1;int right=nums.size()-1;while(left < right){//遍历寻找if(nums[i]+nums[right]+nums[left]>0) {right--;}else if(nums[i]+nums[right]+nums[left]<0){left++;}else{result.push_back(vector<int>{nums[i], nums[left], nums[right]});//去重while(right > left && nums[left]==nums[left+1]){left++;}//为什么是nums[left]=nums[left+1]???while(right > left && nums[right]==nums[right-1]){right--;}left++;right--;}}}return result;}
};

18. 四数之和

     这题和上一题思路一样,就是多加了一层循环

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {//和三数之和类似的思路//先固定a和b的下标,再去找c和dvector<vector<int>> result;sort(nums.begin(),nums.end());for(int i=0;i<nums.size();i++){if(nums[i]>target && nums[i] >= 0) break;//if(i>0 && nums[i]==nums[i-1]){continue;}for(int j=i+1;j<nums.size();j++){if(nums[j] + nums[i] > target && nums[j] + nums[i] >= 0) break;//当target是负数时,只有nums[j] + nums[i] > targe这一个条件,不行,因为后面可能还有负数,所以要确保是正数if(j > i + 1 && nums[j]==nums[j-1]) continue;int left=j+1;int right=nums.size()-1;long long sum=(long long)target-(nums[i]+nums[j]);while(left<right){if((long long)nums[left]+nums[right]>sum){right--;}else if((long long)nums[left]+nums[right]<sum){left++;}else{result.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]});while(left<right && nums[right]==nums[right-1]){right--;}while(left<right && nums[left]==nums[left+1]){left++;}right--;left++;}}}}return result;}
};

总结

总体思路

本专题主要围绕哈希表的应用展开,涵盖了数组、set、map三种哈希表实现方式,解决了多种求和、计数、去重问题。核心思想是用空间换时间,将时间复杂度从O(n²)或O(n³)优化到O(n)或O(n²)。

核心解法

1. 454. 四数相加II

解法:分组哈希 + 互补查找

  • 将4数组分为2组:A+B 和 C+D

  • 用map存储A+B的所有和及其出现次数

  • 查找C+D的和的相反数是否在map中

  • 时间复杂度:O(n²)

2. 383. 赎金信

解法:数组哈希表

  • 使用长度为26的数组作为简易哈希表

  • 统计magazine中每个字母的出现次数

  • 遍历ransomNote消耗字母计数

  • 关键点:数组比unordered_set更高效

3. 15. 三数之和

解法:排序 + 双指针 + 去重

  • 先排序以便去重和使用双指针

  • 固定一个数,转化为两数之和问题

  • 双指针寻找互补值,同时处理去重

  • 难点:多重去重逻辑

4. 18. 四数之和

解法:双循环 + 双指针 + 去重

  • 三数之和的扩展,多一层循环

  • 固定两个数,转化为两数之和问题

  • 注意整数溢出和负数情况下的提前终止条件

  • 关键点:使用long long防止溢出

 关键点

  1. 哈希表选择原则

    • 需要统计次数 → unordered_map

    • 只需要判断存在 → unordered_set

    • 键范围小且连续 → 数组

  2. 去重技巧

    • 排序后跳过相同元素

    • 确定固定位置和移动指针

    • 在合适的位置进行去重(找到解后)

    • 注意去重条件的边界判断

  3. 优化策略

    • 分组处理降低复杂度

    • 双指针替代多重循环

    • 提前终止不必要的计算(剪枝

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3源码reactivity响应式篇之computed计算属性

概述 vue3中&#xff0c;computed函数用于表示计算属性&#xff0c;有惰性求值、响应式追踪依赖的特点。本文将介绍computed的实现原理以及其机制细节。 源码解析 computed计算属性和computed方法、ComputedRefImpl类以及refreshComputed方法有关。 computed方法 computed暴露给…

[嵌入式embed]Keil5烧录后STM32不自动运行,复位才能运行

[嵌入式embed]Keil5烧录后STM32不自动运行,复位才能运行Keil5-验证“Reset and Run”功能是否生效参考文章Keil5-验证“Reset and Run”功能是否生效 参考文章 Keil5烧录后STM32不自动运行&#xff1f;必须复位才能启动的终极解决方案

阿里云Qwen3系列模型部署微调评测

与阿里云一起轻松实现数智化让算力成为公共服务&#xff1a;用大规模的通用计算&#xff0c;帮助客户做从前不能做的事情&#xff0c;做从前做不到的规模。让数据成为生产资料&#xff1a;用数据的实时在线&#xff0c;帮助客户以数据为中心改变生产生活方式创造新的价值。模型…

北京鲁成伟业 | 三屏加固笔记本电脑C156F3

在工业控制、应急指挥、测控及无人机作业等对设备稳定性与环境适应性要求较高的领域&#xff0c;一款性能均衡且坚固耐用的计算机往往能为工作效率提供有力支撑。三屏加固笔记本电脑C156F3便是针对这类需求设计的设备&#xff0c;凭借多方面的特性&#xff0c;可满足不同场景下…

七彩氛围灯芯片EH3A01RGB驱动芯片定时开关IC方案

‍在现代智能家居和个性化照明领域&#xff0c;EH3A01-442A-A24F小夜灯定时芯片凭借其多功能、低功耗和灵活配置的特点&#xff0c;成为LED氛围灯、小夜灯及便携式照明方案的理想选择。本文将深入解析该芯片的核心功能、电气特性及应用场景&#xff0c;帮助开发者与用户全面掌握…

Spring Boot 项目新增 Module 完整指南

1. 模块化开发的重要性 在软件开发中&#xff0c;随着项目规模的不断扩大&#xff0c;​​模块化设计​​已成为提高代码可维护性和可复用性的关键实践。通过将大型项目拆分为多个独立模块&#xff0c;开发团队可以​​并行开发​​不同功能组件&#xff0c;降低代码耦合度&…

Git cherry-pick 与分支重置技术实现代码健全性保障下的提交记录精简

代码健全性保障&#xff1a;上市审查中的 Git 提交记录整理方案&#xff08;核心功能提交筛选流程&#xff09; 一、背景与目的 我司正处于上市筹备阶段&#xff0c;券商需对核心系统进行 Git 代码审查&#xff0c;并基于提交记录生成测试报告。由于原始提交记录包含大量细节性…

前后端联调时出现的一些问题记录

服务器的ip没有设置成所有ip都能访问的&#xff0c;或防火墙没开跨域问题&#xff08;刚开始异源&#xff0c;有这个问题&#xff0c;主要是前端做一下配置代理&#xff0c;后端也可以配置跨域资源共享&#xff08;CORS&#xff09;&#xff09;Configuration public class Cor…

数字图像处理-设计生成一个半球

1 实验题目设计生成一个半球&#xff08;matlab&#xff09;。2 程序源代码%Hemisphere clear,clc,close all %Sphere radius R1; %Set grid number n30; theta (-n:2:n)/n*pi; phi ([0,0:2:n])/n*pi/2; cosphi cos(phi); cosphi(1) 0; cosphi(end) 0; sintheta sin(thet…

mac M1上安装windows虚拟机报错

Parallels版本是18.0.02 mac&#xff1a;arm系统15.6.1 自动获取windows11下载&#xff0c;安装的时候报错&#xff0c;蓝屏&#xff0c;是因为安装的版本不对&#xff0c;猜测原因应该是18.0.02不支持最新版的windows11&#xff0c;需要更新最新版的Parallels。 解决方案&am…

基于R语言机器学习方法在生态经济学领域中的实践技术应用

近年来&#xff0c;人工智能领域已经取得突破性进展&#xff0c;对经济社会各个领域都产生了重大影响&#xff0c;结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一&#xff0c;目前也在飞快的融入计量经济学研究。表面上机器学习通常使用大数据&#xf…

第01章 初识MySQL与mysql8.0的安装

初识 MySQL 文章目录初识 MySQL引言一、数据库基础1.1 什么是数据库1.2 表1.3 数据类型1.4 主键二、数据库技术构成2.1 数据库系统2.2 SQL 语言2.2.1 数据定义语言&#xff08;DDL&#xff09;2.2.2 数据操作语言&#xff08;DML&#xff09;2.2.3 数据查询语言&#xff08;DQL…

【数据结构基础习题】-1- 数据结构基本操作

一、顺序表和链表习题 1. 顺序表就地逆置#include <stdio.h> // 定义顺序表结构 #define MAXSIZE 100 typedef struct {int data[MAXSIZE];int length; } SqList; // 就地逆置顺序表 void reverseList(SqList *L) {int i, temp;for (i 0; i < L->length / 2; i) {…

【Java实战㉞】从0到1:Spring Boot Web开发与接口设计实战

目录一、Spring Boot Web 基础配置1.1 Web 起步依赖&#xff08;spring-boot-starter-web 导入与核心组件&#xff09;1.2 内置服务器配置&#xff08;Tomcat 端口、线程池、连接超时设置&#xff09;1.3 静态资源访问&#xff08;静态资源存放路径、自定义资源映射&#xff09…

房屋安全鉴定机构评价

房屋安全鉴定机构评价&#xff1a;如何选择专业可靠的检测服务在建筑行业快速发展的今天&#xff0c;房屋安全鉴定已成为保障建筑安全、预防事故的重要环节。面对市场上众多的房屋安全鉴定机构&#xff0c;如何科学评价并选择一家专业可靠的服务提供方&#xff0c;是许多业主、…

【算法专题训练】19、哈希表

1、哈希表基础知识 以键值对的方式进行数据存储优点&#xff1a;哈希表数据结构在插入、删除或查找一个元素时&#xff0c;都只需要O(1)的时间 哈希表设计三要点&#xff1a; 为了快速确定一个元素在哈希表中的位置&#xff0c;可以使用一个数组&#xff0c;元素的位置为他的…

某光伏电力监控系统网络安全监测项目:智能组网技术优化方案实践

背景与挑战随着光伏电力行业的快速发展&#xff0c;光伏电站的规模和分布范围日益扩大。电力监控系统作为光伏电站的核心平台&#xff0c;其网络安全直接关系到电力生产的稳定性与可靠性。然而&#xff0c;光伏场站通常分布在偏远地区&#xff0c;网络环境复杂&#xff0c;传统…

GEE训练教程:基于Landsat 8卫星影像识别并提取指定区域内无云覆盖的区域多边形,最终导出为矢量文件

简介 本文使用Google Earth Engine平台,通过Landsat 8卫星影像识别并提取指定区域内无云覆盖的区域多边形,最终导出为矢量文件。主要步骤包括:定义研究区域、创建云检测算法、筛选高质量影像、将无云区域转换为矢量多边形,并进行可视化检查和数据导出。 使用Google Earth…

UniApp 页面通讯方案全解析:从 API 到状态管理的最佳实践

在 UniApp 跨端开发中&#xff0c;组件与页面间的通讯是核心需求。无论是父子组件交互、跨页面数据传递&#xff0c;还是全局状态共享&#xff0c;选择合适的通讯方案直接影响代码的可维护性和性能。本文将系统对比 uni.$emit 系列 API、状态管理库&#xff08;Vuex/Pinia&…

【c++进阶系列】:万字详解AVL树(附源码实现)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 路在脚下延伸时&#xff0c;不必追问终点何在。你迈出的每一步&#xff0c;都在重新定义世界的边界 ★★★ 本文前置知识&#xff1a; …