算法——搜索:两个水壶得到指定容积的水,哈希表hash_function

. - 力扣(LeetCode)

有两个水壶,容量分别为 x 和 y 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 target 升。

你可以:

  • 装满任意一个水壶
  • 清空任意一个水壶
  • 将水从一个水壶倒入另一个水壶,直到接水壶已满,或倒水壶已空。

典型的搜索问题,在任意一个时刻,我们可以且仅可以采取以下几种操作:

把 X 壶的水灌进 Y 壶,直至灌满或倒空;
把 Y 壶的水灌进 X 壶,直至灌满或倒空;
把 X 壶灌满;
把 Y 壶灌满;
把 X 壶倒空;
把 Y 壶倒空。

采用深度优先搜索来解决。不过可能会陷入无限递归。需要使用哈希表去重。

using PII = pair<int, int>;class Solution {
public:bool canMeasureWater(int x, int y, int z) {stack<PII> stk;stk.emplace(0, 0);auto hash_function = [](const PII& o) {return hash<int>()(o.first) ^ hash<int>()(o.second);};unordered_set<PII, decltype(hash_function)> seen(0, hash_function);while (!stk.empty()) {if (seen.count(stk.top())) {stk.pop();continue;}seen.emplace(stk.top());auto [remain_x, remain_y] = stk.top();stk.pop();if (remain_x == z || remain_y == z || remain_x + remain_y == z) {return true;}// 把 X 壶灌满。stk.emplace(x, remain_y);// 把 Y 壶灌满。stk.emplace(remain_x, y);// 把 X 壶倒空。stk.emplace(0, remain_y);// 把 Y 壶倒空。stk.emplace(remain_x, 0);// 把 X 壶的水灌进 Y 壶,直至灌满或倒空。stk.emplace(remain_x - min(remain_x, y - remain_y), remain_y + min(remain_x, y - remain_y));// 把 Y 壶的水灌进 X 壶,直至灌满或倒空。stk.emplace(remain_x + min(remain_y, x - remain_x), remain_y - min(remain_y, x - remain_x));}return false;}
};

哈希表存储pair,分别表示x,y壶中的元素。

如果一个类型没有提供哈希函数,那么需要实现一个哈希函数,否则无法存放进对应的桶中,标准库的和一些标量都实现了这个函数所以不需要重载,如果是自定义类型想要存放在桶里必须实现这个函数否则无法正常存放。所以代码中使用lambda表达式定义了哈希函数。

即    auto hash_function = [](const PII& o) {return hash<int>()(o.first) ^ hash<int>()(o.second);};

然后使用    unordered_set<PII, decltype(hash_function)> seen(0, hash_function);定义哈希表。decltype关键字表示自动类型推导。

auto hash_function = [](const PII& o) {return hash()(o.first) ^ hash()(o.second);}; 这行代码定义了一个lambda表达式 hash_function,用于计算PII类型(假设PII是一个具有两个成员变量的结构体或类)的哈希值。这个lambda表达式接受一个PII对象 o 作为输入,并使用 hash() 函数分别计算 o.first 和 o.second 的哈希值,然后使用异或操作符 ^ 结合这两个哈希值。

unordered_set<PII, decltype(hash_function)> seen(0, hash_function); 这行代码创建了一个无序集合 seen,其元素类型为PII,使用之前定义的 hash_function 作为哈希函数。第一个模板参数指定集合中元素的类型为PII,而第二个模板参数 decltype(hash_function) 指定了哈希函数类型,即使用之前定义的 hash_function。

注意,这里的 0 是作为集合的初始容量传递的,表示集合的初始大小为0。

因此,这段代码的目的是创建一个无序集合 seen,用于存储PII类型的对象,并使用自定义的哈希函数来计算元素的哈希值。这样可以在集合中快速查找、插入和删除元素,并确保元素的唯一性。

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

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

相关文章

猫头虎分享已解决Bug: ERROR: Could not find a version that satisfies the requirement

猫头虎分享已解决Bug: ERROR: Could not find a version that satisfies the requirement &#x1f42f;&#x1f4bb; 摘要 &#x1f4c4; 大家好&#xff0c;我是猫头虎博主&#xff0c;今天我们要聊聊后端技术领域中的一个常见Bug&#xff1a;ERROR: Could not find a vers…

关联规则(理论及实例)

目录 一、啤酒和尿布的故事 二、理论 三、实例 1. 自定义数据集 2. 数据需转换成one-hot编码 3.电影题材关联分析 一、啤酒和尿布的故事 在美国&#xff0c;一些年轻的父亲下班后经常要到超市去购买婴儿尿布&#xff0c;超市因此发现一个规律&#xff0c;在购买婴儿尿布的…

剑指Offer题目笔记25(使用回溯法解决其他类型问题)

面试题85&#xff1a; 问题&#xff1a; ​ 输入一个正整数n&#xff0c;输出所有包含n个左括号和n个右括号的组合&#xff0c;要求每个组合的左括号和右括号匹配。 解决方案&#xff1a; ​ 使用回溯法。因为要生成n个左括号和n个右括号&#xff0c;故需要走2n步&#xff0…

SD-WAN国际网络专线:高效、合规且可靠的跨境连接解决方案

在数字化时代&#xff0c;企业对跨境网络连接的需求日益增长。SD-WAN技术作为一种新兴的解决方案&#xff0c;正逐渐成为构建跨境网络连接的首选。本文将探讨SD-WAN国际网络专线的发展现状、合规性要求以及选择时需要考虑的关键因素。 SD-WAN技术&#xff1a;跨境网络连接的新…

Spring Boot介绍

Spring Boot是一个开源的Java应用框架&#xff0c;它旨在简化Spring应用的初始化和开发过程。通过提供一系列默认的配置和快捷的特性&#xff0c;Spring Boot使得开发人员能够快速地构建和运行基于Spring框架的应用程序。下面将详细介绍Spring Boot项目的各个方面。 一、Sprin…

【C++】排序算法 --快速排序与归并排序

目录 颜色分类&#xff08;数组分三块思想&#xff09;快速排序归并排序 颜色分类&#xff08;数组分三块思想&#xff09; 给定⼀个包含红⾊、⽩⾊和蓝⾊、共 n 个元素的数组 nums &#xff0c;原地对它们进⾏排序&#xff0c;使得相同颜⾊ 的元素相邻&#xff0c;并按照红⾊、…

12-项目部署_持续集成

项目部署_持续集成 1 今日内容介绍 1.1 什么是持续集成 持续集成&#xff08; Continuous integration &#xff0c; 简称 CI &#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干 持续集成的组成要素 一个自动构建过程&#xff0c; 从…

【解读Kubernetes架构】全面指南,带你掌握Kubernetes的设计原理与构成!

了解 Kubernetes 架构&#xff1a;综合指南 前言一、什么是 Kubernetes 架构&#xff1f;1.1、控制平面1.2、工作节点 二、Kubernetes 控制平面组件2.1、kube-api服务器2.2、etcd2.3、kube-scheduler2.4、Kube 控制器管理器2.5、云控制器管理器 &#xff08;CCM&#xff09; 三…

《QT实用小工具·十四》面板容器控件和图形字体示例

1、概述 源码放在文章末尾 面板容器控件包含如下功能&#xff1a; 支持所有widget子类对象&#xff0c;自动产生滚动条。 支持自动拉伸自动填充。 提供接口获取容器内的所有对象的指针。 可设置是否自动拉伸宽度高度。 可设置设备面板之间的间距和边距。 超级图形字体类…

嵌入式软件架构演进:轮询系统、前后台系统、RTOS 架构特点和选择

嵌入式开发主要包括单片机(MCU)开发和以 ARM 为代表的嵌入式 Linux 开发。本文主要讲解单片机开发中嵌入式软件架构的演进,包括从最初的简单轮询式架构,到前后台系统,再到如今复杂多样的实时操作系统(RTOS)。对比各种嵌入式软件架构的特点和差异,并讨论学习 RTOS 的必要…

无库存,无货源,怎么做视频号小店?

大家好&#xff0c;我是电商糖果 有朋友跟糖果说&#xff0c;这视频号小店非常火&#xff0c;自己想趁着这次的风口开店赚钱。 自己无库存&#xff0c;也无货源&#xff0c;能开店卖货不&#xff1f; 糖果告诉他&#xff0c;能卖货&#xff0c;而且还可以让他不到一个月时间…

vivado 系统监控器

系统监控器 (SYSMON) 模数转换器 (ADC) 用于测量硬件器件上的裸片温度和电压。 SYSMON 可通过片上温度和供电传 感器来监控物理环境。 ADC 可为各种应用提供高精度模拟接口。 请参阅下文 &#xff0c; 以获取有关特定器件架构的更多信息 &#xff1a; • 《 UltraScale …

速通汇编(四)汇编andor、shl、shr、inc、dec、xchg、neg指令

一&#xff0c; and&#xff08;与操作&#xff09; 按位与操作符&#xff0c;将两个操作数的对应位进行与操作。 and ax, bx ; 将寄存器 AX 和 BX 中的值进行按位与操作&#xff0c;并将结果存储回寄存器 AX二&#xff0c;or&#xff08;或操作&#xff09; 按位或操作符&…

c# wpf Template ContentTemplate

1.概要 1.1 定义内容的外观 2.2 要点分析 2.代码 <Window x:Class"WpfApp2.Window1"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schem…

电子技术学习笔记

一、半导体器件主要参数及应用 主要参数&#xff1a; 电压&#xff08;Voltage&#xff09;&#xff1a;指器件能够承受或工作的最大电压值&#xff0c;通常以伏特&#xff08;V&#xff09;为单位。 电流&#xff08;Current&#xff09;&#xff1a;指器件能够承受或工作的…

自去岁遭裁,迄今已憩半载有余……

自去岁遭裁&#xff0c;迄今已憩半载有余。初时&#xff0c;每思及空窗期之长&#xff0c;心中难免涌起自责之意&#xff0c;深恐日后求职之路坎坷。然深思熟虑后&#xff0c;方觉人生岂能无休憩之时&#xff1f;偶尔休憩&#xff0c;亦属常理&#xff0c;何必过于自责乎&#…

LangChain学习笔记—RAG(检索增强生成)

LangChain LangChain是一个软件开发框架&#xff0c;可以更轻松地使用大型语言模型&#xff08;LLM&#xff09;创建应用程序。它是一个具有 Python 和 JavaScript 代码库的开源工具。LangChain 允许开发人员将 GPT-4 等 LLM 与外部数据相结合&#xff0c;为聊天机器人、代码理…

C++之函数提高(HM)

目录 1.函数默认参数&#xff08;缺省参数&#xff09; 2.占位参数 3.函数重载 4.类和对象--封装 &#xff08;1&#xff09;圆类&#xff1a; &#xff08;2&#xff09;访问权限 &#xff08;3&#xff09;struct&&class &#xff08;4&#xff09;立方体类的…

最大质因数

描述 给出 N 个数字&#xff0c;试求质因数最大的数字。 输入描述 第一行&#xff0c;一个整数 N &#xff0c;表示数字个数。接下来 N 行&#xff0c;每行一个整数 Ai&#xff0c;表示给出的数字。 输出描述 一个整数&#xff0c;表示质因数最大的数字。 N≤5000,Ai≤20…

第1讲——预备知识

一、视觉SLAM十四讲在讲些啥 SLAM&#xff1a;Simultaneous Localization and Mapping 翻译&#xff1a;同时定位与地图构建 搭载特定传感器的主体&#xff0c;在没有环境先验信息的情况下&#xff0c;于运动过程中建立环境的模型&#xff0c;同时估计自己的运动。 当特定传感…