代码随想录-算法训练营day07【哈希表02:四数相加、赎金信、三数之和、四数之和】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客
第三章 哈希表part02 今日任务 ● 454.四数相加II 
● 383. 赎金信 
● 15. 三数之和 
● 18. 四数之和 
● 总结  详细布置 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使用哈希法 会提高空间复杂度,但一般来说我们都是舍空间 换时间, 工业开发也是这样。题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html  383. 赎金信  建议:本题 和 242.有效的字母异位词 是一个思路 ,算是拓展题 题目链接/文章讲解:https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html 15. 三数之和 建议:本题虽然和 两数之和 很像,也能用哈希法,但用哈希法会很麻烦,双指针法才是正解,可以先看视频理解一下 双指针法的思路,文章中讲解的,没问题 哈希法很麻烦。 题目链接/文章讲解/视频讲解:https://programmercarl.com/0015.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.html 18. 四数之和  建议: 要比较一下,本题和 454.四数相加II 的区别,为什么 454.四数相加II 会简单很多,这个想明白了,对本题理解就深刻了。 本题 思路整体和 三数之和一样的,都是双指针,但写的时候 有很多小细节,需要注意,建议先看视频。 题目链接/文章讲解/视频讲解:https://programmercarl.com/0018.%E5%9B%9B%E6%95%B0%E4%B9%8B%E5%92%8C.html 

目录

0454_四数相加II

0383_赎金信

0015_三数之和

0018_四数之和

总结-map常用方法


0454_四数相加II

本题解题步骤:

  1. 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
  2. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
  3. 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
  4. 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
  5. 最后返回统计值 count 就可以了。
  1. V put(K key, V value)
  2. default V getOrDefault(Object key, V defaultValue)
  • 时间复杂度: O(n^2)
  • 空间复杂度: O(n^2),最坏情况下A和B的值各不相同,相加产生的数字个数为 n^2
class Solution0454 {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int res = 0;Map<Integer, Integer> map = new HashMap<Integer, Integer>();//统计两个数组中的元素之和,同时统计出现的次数,放入mapfor (int i : nums1) {for (int j : nums2) {int sum = i + j;map.put(sum, map.getOrDefault(sum, 0) + 1);}}//统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数for (int i : nums3) {for (int j : nums4) {res += map.getOrDefault(0 - i - j, 0);}}return res;}
}

0383_赎金信

class Solution0383 {public boolean canConstruct(String ransomNote, String magazine) {char[] charArray1 = ransomNote.toCharArray();int[] letter1 = new int[26];for (int i = 0; i < charArray1.length; i++) {letter1[charArray1[i] - 'a']++;}char[] charArray2 = magazine.toCharArray();int[] letter2 = new int[26];for (int i = 0; i < charArray2.length; i++) {letter2[charArray2[i] - 'a']++;}for (int i = 0; i < 26; i++) {if (letter1[i] != 0 && letter2[i] == 0) {return false;}if (letter1[i] <= letter2[i]) {return false;}}return true;}public boolean canConstruct2(String ransomNote, String magazine) {int[] record = new int[26];if (ransomNote.length() > magazine.length()) {return false;}for (int i = 0; i < magazine.length(); i++) {//通过 record 数据记录 magazine 里各个字符出现次数record[magazine.charAt(i) - 'a']++;}for (int j = 0; j < ransomNote.length(); j++) {//遍历 ransomNote,在 record 里对应的字符个数做--操作record[ransomNote.charAt(j) - 'a']--;//如果小于零说明 ransomNote 里出现的字符,magazine 没有if (record[ransomNote.charAt(j) - 'a'] < 0) {return false;}}return true;}public boolean canConstruct3(String ransomNote, String magazine) {//shortcutif (ransomNote.length() > magazine.length()) {return false;}//定义一个哈希映射数组int[] record = new int[26];//遍历for (char c : magazine.toCharArray()) {record[c - 'a'] += 1;}for (char c : ransomNote.toCharArray()) {record[c - 'a'] -= 1;}//如果数组中存在负数,说明ransomNote字符串总存在magazine中没有的字符for (int i : record) {if (i < 0) {return false;}}return true;}
}

0015_三数之和

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;class Solution0015 {//(版本一)双指针public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);//找出a + b + c = 0//a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.length; i++) {//排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了if (nums[i] > 0) {return result;}//错误去重a方法,将会漏掉-1,-1,2 这种情况/*if (nums[i] == nums[i + 1]) {continue;}*///正确去重a方法if (i > 0 && nums[i] == nums[i - 1]) {//去重acontinue;}int left = i + 1;int right = nums.length - 1;while (right > left) {//去重复逻辑如果放在这里,0,0,0的情况,可能直接导致right<=left了,从而漏掉了0,0,0这种三元组/*while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;*/int sum = nums[i] + nums[left] + nums[right];if (sum > 0) {right--;} else if (sum < 0) {left++;} else {result.add(Arrays.asList(nums[i], nums[left], nums[right]));//去重逻辑应该放在找到一个三元组之后,对b和c去重while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;//找到答案时,双指针同时收缩right--;left++;}}}return result;}
}class Solution0015_2 {//(版本二)使用哈希集合public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {//如果第一个元素大于零,不可能凑成三元组if (nums[i] > 0) {return result;}//三元组元素a去重if (i > 0 && nums[i] == nums[i - 1]) {continue;}HashSet<Integer> set = new HashSet<>();for (int j = i + 1; j < nums.length; j++) {//三元组元素b去重if (j > i + 2 && nums[j] == nums[j - 1] && nums[j - 1] == nums[j - 2]) {continue;}int c = -nums[i] - nums[j];if (set.contains(c)) {result.add(Arrays.asList(nums[i], nums[j], c));set.remove(c);//三元组元素c去重} else {set.add(nums[j]);}}}return result;}
}

0018_四数之和

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;class Solution0018 {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {// nums[i] > target 直接返回, 剪枝操作if (nums[i] > 0 && nums[i] > target) {return result;}if (i > 0 && nums[i - 1] == nums[i]) {//对nums[i]去重continue;}for (int j = i + 1; j < nums.length; j++) {if (j > i + 1 && nums[j - 1] == nums[j]) {//对nums[j]去重continue;}int left = j + 1;int right = nums.length - 1;while (right > left) {//nums[k] + nums[i] + nums[left] + nums[right] > target,int会溢出long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];if (sum > target) {right--;} else if (sum < target) {left++;} else {result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));//对nums[left]和nums[right]去重while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;left++;right--;}}}}return result;}
}

总结-map常用方法

在 Java 中,Map 接口提供了多种常用方法来操作键值对。Map 接口中一些常用的方法及其功能描述,它们在 Java 中被广泛使用。

这些方法使得对键值对进行增加、获取、删除、判断是否包含等操作变得十分方便。

这些方法的详细说明如下:

  1. put(K key, V value): 将指定的键与指定的值关联,并返回与键关联的先前值(如果存在)。

  2. get(Object key): 返回指定键所映射的值,如果 Map 中不包含该键,则返回 null。

  3. getOrDefault(Object key, V defaultValue): 返回指定键所映射的值,如果 Map 中不包含该键,则返回指定的默认值。

  4. containsKey(Object key): 如果 Map 包含指定键的映射关系,则返回 true。

  5. containsValue(Object value): 如果 Map 将一个或多个键映射到指定值,则返回 true。

  6. remove(Object key): 如果存在键的映射关系,则将其从 Map 中删除,并返回与该键关联的值。

  7. size(): 返回 Map 中键值对的数量。

  8. isEmpty(): 如果 Map 中没有键值对,则返回 true。

  9. keySet(): 返回一个包含 Map 中所有键的 Set 集合。

  10. values(): 返回一个包含 Map 中所有值的 Collection 集合。

  11. entrySet(): 返回一个包含 Map 中所有键值对的 Set 集合,每个元素都是一个 Map.Entry 对象。

这些是 Map 接口中最常用的方法,可以用来执行键值对的增加、获取、删除、判断是否包含等操作。

package com.question.solve.test;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;public class _001_MapMethod {public static void main(String[] args) {//方法一:在for-each循环中使用entries来遍历Map<Integer, Integer> map = new HashMap<Integer, Integer>();for (Map.Entry<Integer, Integer> entry : map.entrySet()) {System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}//方法二:在for-each循环中遍历keys或values。Map<Integer, Integer> map2 = new HashMap<Integer, Integer>();//遍历map中的键for (Integer key : map2.keySet()) {System.out.println("Key = " + key);}//遍历map中的值for (Integer value : map2.values()) {System.out.println("Value = " + value);}//方法三:使用Iterator遍历Map<Integer, Integer> map3 = new HashMap<Integer, Integer>();Iterator<Map.Entry<Integer, Integer>> entries = map3.entrySet().iterator();while (entries.hasNext()) {Map.Entry<Integer, Integer> entry = entries.next();System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}//方法四:通过键找值遍历(效率低)Map<Integer, Integer> map4 = new HashMap<Integer, Integer>();for (Integer key : map4.keySet()) {Integer value = map4.get(key);System.out.println("Key = " + key + ", Value = " + value);}}
}

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

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

相关文章

tsReact 创建项目

全局安装create-react-app 脚手架 npm install -g create-react-app 或者 yarn add -g create-react-app初始化项目 $ npx create-react-app demo --template typescriptnpm run eject 释放配置文件 通过脚手架创建完项目后&#xff0c;会发现没有任何 配置文件&#xff08;…

C++| QT自定义信号和槽

前言&#xff1a;之前学习QT都是使用自带的信号进行槽函数触发&#xff0c;一直没有找到需要使用自定义信号的场景&#xff0c;但最近读QT项目代码的时候&#xff0c;应用到了自定义信号&#xff0c;所以特地写这篇总结一下。 QT自定义信号和槽 信号和槽为什么要自定义信号如何…

CSRF漏洞初解

CSRF漏洞初解 1.什么是CSRF漏洞 CSRF&#xff08;Cross-Site Request Forgery&#xff09;漏洞是一种Web应用程序安全漏洞&#xff0c;也被称为"One-Click Attack"或"Session Riding"。它利用了Web应用程序对用户在其他网站上已经验证过的身份的信任&…

数据——关键生产要素

数据作为数字经济时代的关键生产要素&#xff0c;逐步融入生产生活各方面&#xff0c;深刻影响并重构着经济社会运行和社会治理&#xff0c;已成为影响未来发展的关键战略性资源。近年来&#xff0c;我国高度重视发展数字经济、数据要素及其市场化配置改革&#xff0c;发布了一…

多模态对齐方案

最全 LMM 模型结构&#xff08;13种&#xff09;综述本文中我们介绍了 13 中常见的大型多模态模型&#xff08;Large Multimodal Models, LMM&#xff09;&#xff0c;包括 BLIP-2&#xff0c;LLaVA、MiniGPT、Qwen-VL 以及 Ferret 等。https://mp.weixin.qq.com/s/EnK7F0yPYmX…

C语言入门(第二天:判断、循环)

一、基础语法 1.1 位运算符(&#xff01;&#xff01;重点) 运算符术语示例结果&按位与011 & 1012个都为1才为1&#xff0c;结果为001|按位或011 & 101有1个为1就为1&#xff0c;结果为111^按位异或011 ^ 101不同的为1&#xff0c;结果为110~取反011100<<左…

使用Python实现自动化网页答题功能-模拟考试篇

介绍 在驾驶员考试网站上进行模拟考试python自动答题 自动化原理 该脚本使用了自动化模块 DrissionPage 中的 ChromiumPage 类来实现网页的自动化操作。通过定位网页元素和模拟点击操作&#xff0c;完成了选择答案和提交答卷的过程。 用途与注意事项 用途&#xff1a;该脚本…

LLM推理框架Triton Inference Server学习笔记(二): Triton模型部署流程(stey by stey)

官方文档查阅: TritonInferenceServer文档 1. 写在前面 上一篇文章对triton inference server进行了一个整体的介绍&#xff0c;解答了三个经典问题what, why, how。 这篇文章就开始转入实践&#xff0c; 从实践的角度整理Triton模型部署的全流程&#xff0c; 如果我有一个训…

系统架构最佳实践 -- 卡券系统架构设计

目录 1.卡券类型的设计&#xff1a; 2.用户领取和使用流程&#xff1a; 3.卡券发放与管理&#xff1a; 4.卡券核销与统计&#xff1a; 5.安全性和防欺诈&#xff1a; 随着电子商务的迅速发展&#xff0c;卡券系统成为了各种商家吸引用户和促销的重要手段。在设计和实现卡券…

分享一个预测模型web APP的功能模块和界面的设计

一个临床预测模型web APP功能模块与界面设计 随着医疗技术的不断进步&#xff0c;web APP是临床预测模型在医学领域的应用的重要形式。这里分享一个web APP的设计&#xff0c;手里有医学预测模型的可以尝试将其构建成webAPP&#xff0c;进而在临床实践中体验预测模型带来的便利…

【Druid】数据库连接超时

现象&#xff1a; 接口请求&#xff0c;10秒钟超时&#xff0c;看了一下&#xff0c;是sql查询耗时太长了&#xff0c;数据还没来得及返回&#xff0c;连接就断开了。 连接断开&#xff0c;上层应用直接报错。。 这些问题&#xff0c;都是。。。知道答案后&#xff0c;就觉得&…

CTF工具下载(1)----随波逐流

为什么要写这个博客喃&#xff0c;因为随波逐流每隔一段时间就会更新&#xff0c;要下载最新版本才能用&#xff0c;但是每次都会有点麻烦&#xff0c;所以写一个博客记录下。 1.进入官网&#xff0c;点击 2.进入城通网盘 3.进入编码工具 4.点击最新版本的随波逐流就下载了&am…

在Mac主机上连接Linux虚拟机

前言 最近醉心于研究Linux&#xff0c;于是在PD上安装了一个Debian Linux虚拟机&#xff0c;用来练练手。但是每次在mac和Linux之间切换很是麻烦&#xff0c;有没有一种方法&#xff0c;可以在mac终端直接连接我的虚拟机&#xff0c;这样在mac终端上就可以直接操控我的Linux虚…

咸鱼之王_手游_开服搭建架设_内购修复无bug运营版

视频演示 咸鱼之王_手游_开服 游戏管理后台界面 源码获取在文章末尾 源码获取在文章末尾 源码获取在文章末尾 或者直接下面 https://githubs.xyz/y28.html 1.安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &…

(2024,IXC2-4KHD,LVLM,动态图像分割,高分辨率图像处理)InternLM-XComposer2-4KHD

InternLM-XComposer2-4KHD: A Pioneering Large Vision-Language Model Handling Resolutions from 336 Pixels to 4K HD 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方…

【云计算】云数据中心网络(二):弹性公网 IP

云数据中心网络&#xff08;二&#xff09;&#xff1a;弹性公网 IP 1.什么是弹性公网 IP2.弹性公网 IP 的类型2.1 多线 EIP2.2 任播 EIP2.3 单线静态 EIP2.4 精品 EIP2.5 识别不同类型的 IP 的地址 3.弹性公网 IP 功能3.1 自带公网 IP 地址上云3.2 尽力找回公网 IP 地址3.3 连…

【学习心得】神经网络知识中的符号解释②

我在上篇文章中初步介绍了一些神经网络中的符号&#xff0c;只有统一符号及其对应的含义才能使我自己在后续的深度学习中有着一脉相承的体系。如果对我之前的文章感兴趣可以点击链接看看哦&#xff1a; 【学习心得】神经网络知识中的符号解释①http://t.csdnimg.cn/f6PeJ 一、…

3. 安装arrach结构的Mysql

提示&#xff1a;arm的centos上面安装arrach结构的Mysql 文章目录 前言一、查看已经安装过的并卸载mysql二、创建mysql用户组1.设置用户组2. 安装3.设置启动4.查看密码5.修改登录密码6.授权7.修改连接8.设置参数 常见问题排查1. 启动失败查看&#xff1a;2. 用户操作3. 踩坑解决…

Leetcode刷题-字符串详细总结(Java)

字符串 字符串可能在算法处理上面和数组是类似的&#xff0c;但是String和数组的数据结构还是有一些不一样的 1、反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 双指针的经典应用&#xff0c;两个指针同时向中间移动 public void reverseString(char[…

fail2ban检查配置自动黑名单策略

安装 fail2ban 更新系统包索引&#xff08;以 Ubuntu/Debian 为例&#xff09;&#xff1a; sudo apt update安装 fail2ban&#xff1a; sudo apt install fail2ban基本配置 复制默认配置文件&#xff1a; fail2ban 的默认配置文件位于 /etc/fail2ban/jail.conf。为避免升级软件…