代码随想录算法训练营第十一天|383. 赎金信, 15. 三数之和

文档讲解:代码随想录

难度:easy

383. 赎金信

力扣题目链接(opens new window)

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。

(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)

注意:

你可以假设两个字符串均只含有小写字母。

canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true

思路:

因为题目说只有小写字母,那可以采用空间换取时间的哈希策略,用一个长度为26的数组来记录magazine里字母出现的次数。

步骤如下:

  1. 将ransomNote和magazine长度比较(magazine一定更长,因为ransomNote的元素都包含在中magazine,故ransomNote是magazine的真子集),如果magazine一定更长继续进行下面的操作,否则返回false
  2. 创建一个哈希映射数组record将magazine和ransomNote通过ToCharArray( )的用法,将字符串对象中的字符转换为一个字符数组。
  3. 再通过record[c - 'a'] += 1;统计magazine和ransomNote中的a到z的有无及个数
  4. 最后将a到z的有无及个数比较就可以完成。

补充1:

ToCharArray( )的用法,将字符串对象中的字符转换为一个字符数组。

详解释就是:

字符串转换成字符数组后,每个字符的ASC码与字符T的ASC码进行二进制异或运算。

最后把结果转换回字符。

 

这个和foreach的for循环一样的,也就是遍历
这里的for(char c:chars)就是定义一个遍历字符c,让它分别等于字符串数组chars里面的各个字符,然后执行下面的语句,当c被赋值为chars里面所有字符各一次后,就会退出这个循环.

补充2:

record[c - 'a'] += 1;:在循环体内,这行代码用于更新record数组中对应字符c的计数。这里的关键在于理解c - 'a'这个表达式。由于c是一个字符变量,且假设它代表一个小写字母('a'到'z'),c - 'a'的结果就是这个字符相对于字母'a'的偏移量。例如,如果c是'b',那么c - 'a'的结果是1,因为'b'在字母表中是'a'之后的第一个字母。

record数组的大小通常是26(对应于26个小写英文字母),并且每个索引位置代表一个字母的计数。因此,record[0]代表'a'的计数,record[1]代表'b'的计数,依此类推,直到record[25]代表'z'的计数。

通过record[c - 'a'] += 1;,我们找到c对应的数组索引,并将该位置的计数增加1。这样,当循环结束时,record数组中的每个元素都存储了对应字母在magazine字符串中出现的次数。

class Solution {public boolean canConstruct(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;}
}

第15题. 三数之和

力扣题目链接(opens new window)

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意: 答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

视频:《代码随想录》算法视频公开课 (opens new window):梦破碎的地方!| LeetCode:15.三数之和

思路1:

  1. 创建一个存【int类型数据的列表】类型数据的列表,
  2. 将数组从小到大排序
  3. 进入循环:先判断每次三元组的第一个元素是不是>0(数组为排序后,故如果三元组第一个元素大于0那么就不可能符合要求),如果是则结束程序
  4. 对nums[i]去重(题目要求:注意:答案中不可以包含重复的三元组。)
  5. 创建一个集合set
  6. 对nums[j]去重
  7. 因为0=a+b+c,故c=0-a-b。
  8. contains方法判断是否符合,如果符合返回true,进入循环体将给定的元素列表转换为一个固定大小的列表加入set
  9. 最后通过remove(c)去重

补充:

步骤1

List<List>的作用List指的是存int类型数据的列表,List<List>指的是存【int类型数据的列表】类型数据的列表------就是这个母列表存子列表,其子列表存int类型的数据。

 

步骤2

常规一个数组参数,将数组从小到大排序,时间复杂度为o(nlog n)
Arrays.sort(nums);

 

步骤3

i > 0:这个条件确保当前索引 i 不是数组的第一个元素。因为我们要比较 nums[i] 和 nums[i - 1],如果 i 是 0,那么 nums[i - 1] 将尝试访问数组的 -1 索引,这是非法的。

 

步骤4

nums[i] == nums[i - 1]:这个条件检查当前元素 nums[i] 是否与前一个元素 nums[i - 1] 相等。如果相等,那么可能意味着在搜索满足特定条件(如三个数之和为零)的三元组时,我们会遇到重复的组合。

 

步骤3,4

如果上述两个条件都满足,即 i > 0 且 nums[i] == nums[i - 1],则执行 continue 语句。continue 语句会导致当前迭代立即结束,并继续下一次迭代(即下一个 i 的值)。这意味着,对于满足条件的当前元素 nums[i],循环体内的剩余代码将不会被执行。

 

步骤3,4

continue 语句可以将程序的控制权移到循环的末尾以去重复

 

步骤7

Java中的contains方法是一个用于检测字符串中是否包含指定子字符串的实用工具。与indexOf方法类似,它的核心功能是查找子字符串在原字符串中的位置,但有所不同。当调用abcdefg.contains("c")时,它会返回一个布尔值,指示"c"是否存在于"abcdefg"中,结果为true。相反,abcdefg.indexOf("c")则会返回子字符串"c"在主字符串中的起始索引,这里是2,如果找不到则返回-1。因此,contains方法更直观地回答了我们是否找到了特定的子字符串,而indexOf则提供了子字符串的具体位置信息。

 

步骤8

Arrays.asList(...):这是一个静态方法,用于将给定的元素列表转换为一个固定大小的列表。在这个场景中,它用于创建一个包含三个元素(nums[i]nums[j]c)的列表。

 

 

步骤9

remove()方法是Set接口中的一个方法,通过它可以删除Set集合中指定的元素。具体语法如下:

boolean remove(Object o)
class Solution {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;}
}

思路2:双指针

大体与思路1一致,

将left定义为num[i]的下一个,right定义为最后一个,while是将两个指针向中间移动,

由于right较大,故如果sum大于0,则right-1;如果sum小于0,left+1;如果sum等于0,则返回思路1的步骤8后半部分。

再进行left和right的去重

class Solution {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;}if (i > 0 && nums[i] == nums[i - 1]) {  // 去重acontinue;}int left = i + 1;int right = nums.length - 1;while (right > 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;}
}

 

 

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

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

相关文章

算法Day-2

27. 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&am…

zotero下载、安装、翻译和显示无法安装插件“%S”的解决办法

文章目录 zotero下载和安装和翻译还有插件英文翻译软件遇到的问题 zotero下载和安装和翻译还有插件 Zotero从入门到精通第一期–如何省心省力翻译科研文献&#xff0c;这里面主要是使用小牛翻译的过程&#xff0c;输入产品密匙需要加入个人的账号密码进行sign in 英文翻译软件…

动态规划17:123. 买卖股票的最佳时机 III

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;123.…

递归神经网络(RNN)简介

递归神经网络简介 在本文中,我们将介绍神经网络的一种新的变体,即递归神经网络,也称为 (RNN),当数据是连续的时,如时间序列数据和文本数据,它比简单的神经网络效果更好。 什么是递归神经网络 (RNN)? 循环神经网络 (RNN) 是一种神经网络,其中上一步的输出作为当前…

Quarto ppt模板制作与Rstudio git连接

本篇记录下当前ppt演示中比较流行的quarto document使用情况以及Rstudio与git相连接的一些实操。 1 Quarto ppt模板制作 1.1 Quarto简介&#xff08;来自Kimi&#xff09; Quarto 是一个由 RStudio 的母公司 Posit 团队开发的开源科学和技术出版系统&#xff0c;它建立在 Pan…

计算机网络——传输层服务

传输层会给段加上目标ip和目标端口号 应用层去识别报文的开始和结束

upload-labs靶场Pass-01

upload-labs靶场Pass-01 分析 查看提示&#xff0c;提示如下 查看源码 function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传…

Java-类与对象-下篇

关于类与对象&#xff0c;内容较多&#xff0c;我们分为两篇进行讲解&#xff1a; &#x1f4da; Java-类与对象-上篇&#xff1a;————<传送门:Java-类与对象-上篇-CSDN博客> &#x1f4d5; 面向对象的概念 &#x1f4d5; 类的定义格式 &#x1f4d5; 类的使用 …

ubuntu 安装nginx

sudo apt-get update sudo apt-get install nginx sudo nginx -vsudo systemctl status nginx sudo systemctl start nginx sudo systemctl stop nginx sudo systemctl restart nginx#浏览器输入&#xff1a;http://192.168.31.181/#查看文件结构 cd /etc/nginx sudo cp nginx.…

Java 类和对象详解(下)

个人主页&#xff1a;鲤鱼王打挺-CSDN博客 目录 &#x1f497;前言&#xff1a; &#x1f4af;一.static关键字 1. 为什么要使用static 2. static 修饰成员变量&#xff1a; 3. static 修饰成员方法&#xff1a; ​编辑 4. 静态代码块 5.静态导入包 &#x1f4af;二.…

Wi-Fi安全性入门(基于ESP-IDF-v4.4)

主要参考资料&#xff1a; Wi-Fi 安全性: https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.4/esp32/api-guides/wifi-security.html 目录 1.ESP32 Wi-Fi 安全功能1.1 受保护的管理帧 (PMF)1.2 第三代 Wi-Fi 访问保护 (WPA3-Personal) 1.ESP32 Wi-Fi 安全功能 支…

linux系统之jar启动脚本

编辑linux启动脚本 执行 vi run_blog 按i 进入编辑&#xff0c;复制以下代码&#xff0c;并根据当前环境修改三个参数。以下是详细完整脚本代码&#xff1a; #!/bin/bash# 配置部分 JAR_PATH"/path/to/your/app.jar" # 替换为你的 JAR 文件的实际路径 L…

Gin框架操作指南07:路由与中间件

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

【JVM】内存模型

文章目录 内存模型的基本概念案例 程序计数器栈Java虚拟机栈局部变量表栈帧中局部变量表的实际状态栈帧中存放的数据有哪些 操作数栈帧数据 本地方法栈 堆堆空间是如何进行管理的? 方法区静态变量存储 直接内存直接内存的作用 内存模型的基本概念 在前面的学习中,我们知道了字…

Java 8 Stream API:从基础到高级,掌握流处理的艺术

一、Stream&#xff08;流&#xff09;基本介绍 Java 8 API 添加了一个新的抽象称为Stream&#xff08;流&#xff09;&#xff0c;可以让你以一种声明的方式处理数据&#xff0c;这种风格将要处理的元素集合看做一种流&#xff0c;元素流在管道中传输&#xff0c;并在管道中间…

云黑系统全解无后门 +搭建教程

这套系统呢是玖逸之前南逸写的一套云黑系统&#xff0c;功能带有卡密生成和添加黑名单等&#xff0c;源码放在我的网盘里已经两年之久&#xff0c;由于玖逸现在已经跑路了所以现在发出来分享给大家&#xff0c;需要的可以自己拿去而开&#xff0c;反正功能也不是很多具体的自己…

电脑视频剪辑大比拼,谁更胜一筹?

随着短视频的火爆&#xff0c;越来越多的人开始尝试自己动手制作视频&#xff0c;无论是记录生活点滴还是创作个性短片&#xff0c;一款好用的视频剪辑软件是必不可少的。今天&#xff0c;我们就从短视频运营的角度&#xff0c;来聊聊几款热门的电脑视频剪辑软件&#xff0c;看…

docker配置加速器

阿里云 控制台》容器镜像服务》镜像工具》镜像加速器 复制地址&#xff1a;https://ywtoq7bz.mirror.aliyuncs.com 到&#xff1a;etc/docker下&#xff1a;vi daemon.json 格式&#xff1a; { "registry-mirrors": ["加速器地址"] } 注&#xff1…

JavaScript:闭包、防抖与节流

一&#xff0c;闭包 1&#xff0c;什么是闭包 闭包是指一个函数和其周围的词法环境(lexical environment)的组合。 换句话说&#xff0c;闭包允许一个函数访问并操作函数外部的变量。 闭包的核心特性: 函数内部可以访问外部函数的变量即使外部函数已经返回&#xff0c;内部…

一款新开源跨平台的.NET Word(docx)模版导出引擎,完美支持Linux和Mac操作系统(附源码)

前言 在数字化办公日益盛行的今天&#xff0c;文档处理成为了我们日常工作不可或缺的一部分。然而&#xff0c;许多传统的文档处理工具都依赖于特定的操作系统和复杂的组件安装&#xff0c;这无疑给跨平台办公带来了诸多不便。为了解决这一问题&#xff0c;我们找到了一个新的…