365. 水壶问题

news2024/12/25 9:23:45

365. 水壶问题

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:

原题链接:

365. 水壶问题

https://leetcode.cn/problems/water-and-jug-problem/description/

完成情况:

在这里插入图片描述

解题思路:

	/**
	 在任意一个时刻,我们可以且仅可以采取以下几种操作:
		 把 X 壶的水灌进 Y 壶,直至灌满或倒空;
		 把 Y 壶的水灌进 X 壶,直至灌满或倒空;
		 把 X 壶灌满;
		 把 Y 壶灌满;
		 把 X 壶倒空;
		 把 Y 壶倒空。
	 */

具体如何判断能否撞到那个分量的水,可以参考一下的一个错误代码:

package 西湖算法题解___中等题;

import java.util.ArrayList;
import java.util.List;

public class __365水壶问题__错误思路 {
	//AC   15/28
	/**
	 有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 targetCapacity 升。
	 */
	public boolean canMeasureWater(int jug1Capacity, int jug2Capacity, int targetCapacity) {
		int remind1 =0,remind2 = 0;
		if (jug1Capacity>=jug2Capacity){
			remind1 = jug1Capacity-jug2Capacity;
			if (jug2Capacity>=remind1){
				remind2 = jug2Capacity-remind1;
			}else {
				remind2 = remind1 -jug2Capacity;
			}
		}else{
			remind1 = jug2Capacity-jug1Capacity;
			if (jug1Capacity >= remind1){
				remind1 = jug1Capacity  -remind1;
			}else{
				remind1 = remind1 - jug2Capacity;
			}
		}
		int nums[] = new int[]{jug1Capacity,jug2Capacity,remind1,remind2};

		List<Integer> resultList = new ArrayList<>();
		// 进行任意两个数的+或者-运算
		for (int i = 0; i < nums.length; i++) {
			for (int j = 0; j < nums.length; j++) {
				if (i != j) {
					resultList.add(nums[i] + nums[j]);
					resultList.add(nums[i] - nums[j]);
				}
			}
		}
		for (int num:resultList){
			if (num == targetCapacity){
				return true;
			}
		}
		return false;
	}
}

参考代码:

package 西湖算法题解___中等题;

import java.util.*;

/**
 * @author 25678
 */
public class __365水壶问题__用栈去深搜 {
	public boolean canMeasureWater(int jug1Capacity, int jug2Capacity, int targetCapacity) {
		/**
		 在任意一个时刻,我们可以且仅可以采取以下几种操作:
			 把 X 壶的水灌进 Y 壶,直至灌满或倒空;
			 把 Y 壶的水灌进 X 壶,直至灌满或倒空;
			 把 X 壶灌满;
			 把 Y 壶灌满;
			 把 X 壶倒空;
			 把 Y 壶倒空。


		 */

		Deque<int[]> stack = new LinkedList<>();
		//所以要用Deque实现栈stack,那么必然是要继承LinkedList;
		/*
		`Deque`(双端队列)是Java集合框架中的接口,用于表示一个可以在两端进行插入和删除操作的数据结构。`ArrayDeque`和`LinkedList`都实现了`Deque`接口,但它们在内部实现和性能方面有一些不同之处。

1. **内部实现方式**:
   - `ArrayDeque`: 内部使用动态数组(循环数组)来存储元素。它通过在数组的两端保留指针来实现双端操作。当数组满时,它会自动进行扩展,以适应更多的元素。由于数组具有连续内存分配,因此在内存访问方面可能更加高效。

   - `LinkedList`: 内部使用双向链表来存储元素。每个元素都有指向前一个和后一个元素的引用。这使得在链表中插入和删除元素比较高效,但在随机访问元素时可能会较慢,因为需要遍历链表。

2. **性能差异**:
   - `ArrayDeque`: 由于其基于数组的内部实现,`ArrayDeque` 在随机访问和元素存取时可能更快,因为数组支持直接索引。另外,由于数组分配的内存是连续的,它可能在缓存方面也具有一些优势,从而提供更好的性能。

   - `LinkedList`: `LinkedList` 在插入和删除元素时比较高效,特别是在列表中间插入或删除元素。然而,由于需要遍历链表来访问元素,随机访问的性能相对较差。

在选择使用哪种实现时,您需要根据您的特定需求权衡优劣。如果您需要频繁进行插入和删除操作,并且不太关心随机访问性能,`LinkedList` 可能更适合。如果您需要高效的随机访问和高性能的双端操作,`ArrayDeque` 可能是更好的选择。

另外,需要注意的是,`ArrayDeque` 在大多数情况下会比 `LinkedList` 具有更好的性能,因为它在实现中更接近内存的布局和硬件缓存行的优化。但是具体的性能表现还会受到其他因素的影响,如具体使用场景、元素数量等。
		 */
		stack.push(new int[]{0,0});
		//1 <= jug1Capacity, jug2Capacity, targetCapacity <= 106
		Set<Long> seen = new HashSet<Long>();
		while (!stack.isEmpty()){
			if (seen.contains(hash_state(stack.peek()))){
				stack.pop();
				continue;
			}
			seen.add(hash_state(stack.peek()));
			int [] state=stack.pop();
			int remain_x = state[0],remain_y = state[1];
			if (remain_x == targetCapacity || remain_y == targetCapacity || remain_y +remain_x == targetCapacity){
				return true;
			}
			//每次都对水壶执行如下操作:
//			把 X 壶的水灌进 Y 壶,直至灌满或倒空;
			stack.push(new int[]{jug1Capacity,remain_y});
//			把 Y 壶的水灌进 X 壶,直至灌满或倒空;
			stack.push(new int[]{remain_x,jug2Capacity});
//			把 X 壶灌满;
			stack.push(new int[]{0,remain_y});
//			把 Y 壶灌满;
			stack.push(new int[]{remain_x,0});
//			把 X 壶倒空;
			stack.push(new int[]{remain_x - Math.min(remain_x,jug2Capacity - remain_y),remain_y + Math.min(remain_x,jug2Capacity - remain_y)});
//			把 Y 壶倒空。
			stack.push(new int[]{remain_x + Math.min(remain_y ,jug1Capacity - remain_x),remain_y - Math.min(remain_y,jug1Capacity - remain_x)});
		}
		return false;
	}

	private Long hash_state(int[] peek) {
		return (long)peek[0]*1000001 + peek[1];
	}
}

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

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

相关文章

[Web_Unagi]xxe注入过滤绕过

文章目录 [Web_Unagi]xxe注入过滤绕过 [Web_Unagi]xxe注入过滤绕过 提示我们需要上传文件&#xff0c;并且flag在根目录下&#xff0c; 上传文件的格式为&#xff1a; <users><user><username>alice</username><password>passwd1</password…

封装上传文件组件(axios,进度条onUploadProgress,取消请求)

目录 定时模拟进度条 方法 A.axios B.xhr 取消请求​​​​​​​ 完整代码 A.自定义上传组件 B.二次封装组件 情况 增加cancelToken不生效&#xff0c;刷新页面 进度条太快->设置浏览器网速 定时模拟进度条 startUpload() {if (!this.file) return;const totalS…

【C++】bind包装器

bind包装器 调用bind的一般形式&#xff1a;auto newCallable bind(callable,arg_list); 其中&#xff0c;newCallable本身是一个可调用对象&#xff0c;arg_list是一个逗号分隔的参数列表&#xff0c;对应给定的 callable的参数。 当我们调用newCallable时&#xff0c;newCa…

【内网穿透】配置公网访问,实现远程连接到内网群晖NAS 6.X

公网远程访问内网群晖NAS 6.X【内网穿透】 文章目录 公网远程访问内网群晖NAS 6.X【内网穿透】前言1. 群晖NAS远程操作2. 创建一条“群晖SSH”隧道 &#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&#xff1a;&#x1…

虚拟ip地址软件哪个好 手机虚拟ip地址软件有哪些

虚拟ip地址修改器 IP转换器软件是一种用于把不同格式的IP地址转换为另一种格式的工具。下面是几种常见的深度IP转换器软件&#xff1a; 1. 深度IP转换器 深度IP转换器是一种收费的、简单易用的在线工具&#xff0c;可以将IPv4地址转换为16进制、2进制和10进制等格式。此外&am…

面向万物智联的应用框架的思考与探索

本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第3期 | 面向万物智联的应用框架的思考与探索》 演讲嘉宾 | 余枝强 回顾整理 | 廖 涛 排版校对 | 李萍萍 嘉宾简介 余枝强&#xff0c;OpenHarmony技术指导委员会跨平台应用开发框架TSG负责人&#xff0c;华为终端软件部…

现代C++中的从头开始深度学习【2/8】:张量编程

一、说明 初学者文本&#xff1a;此文本需要入门级编程背景和对机器学习的基本了解。张量是在深度学习算法中表示数据的主要方式。它们广泛用于在算法执行期间实现输入、输出、参数和内部状态。 在这个故事中&#xff0c;我们将学习如何使用特征张量 API 来开发我们的C算法。具…

冠达管理:A股三大指数震荡整理 机构看好反弹趋势延续

周一&#xff0c;沪深两市呈弱势震动格式&#xff0c;创业板指领跌。到收盘&#xff0c;上证综指跌0.59%&#xff0c;报3268.83点&#xff1b;深证成指跌0.83%&#xff0c;报11145.03点&#xff1b;创业板指跌1%&#xff0c;报2240.77点。 资金面上&#xff0c;沪深两市昨日合计…

基于随机森林的回归分析,随机森林工具箱,随机森林的详细原理

目录 背影 摘要 随机森林的基本定义 随机森林实现的步骤 基于随机森林的回归分析 随机森林回归分析完整代码及工具箱下载链接&#xff1a; 随机森林分类工具箱&#xff0c;分类随机森林&#xff0c;随机森林回归工具箱&#xff0c;回归随机森林资源-CSDN文库 https://download.…

C++11之右值引用

C11之右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的 右值引用&#xff08;rvalue reference&#xff09;语法特性&#xff0c;所以从现在开始我们之前学习的引用就叫做左值引用&#xff08;lvalue reference&#xff09;。无论左值引用还是右值引用&#…

依赖管理插件

项目场景&#xff1a; 接手新项目 第一步: 检查项目 看文件中包管理工具是什么 包管理工具有很多种&#xff0c;不要拿到就npm安装依赖 问题描述 在项目下 安装pnpm总是报错 查看了网上没找到具体解决方案 解决方案&#xff1a; 全局安装pnpm 全局安装pnpm npm insta…

中电金信:ChatGPT一夜爆火,知识图谱何以应战?

随着ChatGPT的爆火出圈 人工智能再次迎来发展小高潮 那么作为此前搜索领域的主流技术 知识图谱前路又将如何呢&#xff1f; 事实上&#xff0c;ChatGPT也并非“万能”&#xff0c;作为黑箱模型&#xff0c;ChatGPT很难验证生成的知识是否准确。并且ChatGPT是通过概率模型执行推…

Java基础入门篇——Java变量类型的转换和运算符(七)

目录 一、变量类型 1.1自动类型转换&#xff08;隐式转换&#xff09; 1.2 强制类型转换&#xff08;显式转换&#xff09; 1.3类型转换的其他情况 二、运算符 2.1算术运算符 2.2比较运算符 2.3逻辑运算符 2.4位运算符 三、总结 在Java中&#xff0c;变量类型的转换…

\vendor\github.com\godror\orahlp.go:531:19: undefined: VersionInfo

…\goAdmin\vendor\github.com\godror\orahlp.go:531:19: undefined: VersionInfo 解决办法 降了go版本(go1.18)&#xff0c;之前是go1.19 gorm版本不能用最新的&#xff0c;降至&#xff08;gorm.io/gorm v1.21.16&#xff09;就可以 修改交插编译参数 go env -w CGO_ENABLED1…

机器学习深度学习—语言模型和数据集

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——文本预处理 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 语…

订单系统就该这么设计,稳的一批~

订单功能作为电商系统的核心功能&#xff0c;由于它同时涉及到前台商城和后台管理系统&#xff0c;它的设计可谓是非常重要的。就算不是电商系统中&#xff0c;只要是涉及到需要交易的项目&#xff0c;订单功能都具有很好的参考价值&#xff0c;说它是通用业务功能也不为过。今…

单元测试最终结果为Stopped状态(有报错后不继续往下执行)

之前跑了一下项目的单元测试&#xff0c;但是发现一旦有报错后单元测试就不继续往下执行&#xff0c;而且最终的结果是stopped状态&#xff0c;截图如下&#xff1a; 经过排查是因为项目启动的时候有如下的代码&#xff1a; 通过代码可以发现如果项目启动失败&#xff0c;则直接…

如何用python画动漫人物,python画卡通人物代码

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python画动漫人物代码 星空&#xff0c;如何用python画动漫人物&#xff0c;现在让我们一起来看看吧&#xff01; 要寒假了&#xff0c;给孩子画一个卡通版蜘蛛侠 完整程序代码&#xff1a; from turtle import * speed…

鉴源实验室|公钥基础设施(PKI)在车联网中的应用

作者 | 付海涛 上海控安可信软件创新研究院汽车网络安全组 来源 | 鉴源实验室 01 PKI与车联网 1.1 PKI概述 公钥基础设施&#xff08;PKI ,Public Key Infrastructure&#xff09;是一种在现代数字环境中实现认证和加密的基本框架&#xff0c;主要用于保护网络交互和通信的安…

新手教程:5步掌握系统流程图绘制方法!

流程图通常用于管理、分析、设计许多不同领域的流程&#xff0c;是一个很有用的工具&#xff0c;能够帮助大家更轻松、更有效地解决问题。系统流程图是流程图的常见变体之一。 系统流程图是展示数据流以及决策如何影响周围事件的图表类型。 与其他类型的流程图一样&#xff0c;…