HOT100--Day20--39. 组合总和,22. 括号生成,79. 单词搜索

HOT100–Day20–39. 组合总和,22. 括号生成,79. 单词搜索

每日刷题系列。今天的题目是《力扣HOT100》题单。

题目类型:回溯。

关键:掌握排列,组合。记得回溯。可以重复选的话,下一层index从哪里开始?单词搜索和括号生成都值得二刷。

39. 组合总和

思路:

注意每个元素可以选任意多次。

所以backtrack的时候,每次前往下一层,都是从当前层的遍历的到的位置开始进入下一层。

pathSum == target就找到一种情况了。

pathSum > target提前返回。

class Solution {private List<List<Integer>> res = new ArrayList<>();private List<Integer> path = new ArrayList<>();private int pathSum = 0;public List<List<Integer>> combinationSum(int[] candidates, int target) {backtrack(candidates, target, 0);return res;}private void backtrack(int[] nums, int target, int startIndex) {// sum多了,结束if (pathSum > target) {return;}// 找到一种组合的情况if (pathSum == target) {res.add(new ArrayList(path));return;}// 从index开始,加入path。for (int i = startIndex; i < nums.length; i++) {path.add(nums[i]);pathSum += nums[i];// 注意!因为可以重复选,下一层是从i开始选!backtrack(nums, target, i);pathSum -= nums[i];path.remove(path.size() - 1);}}
}

22. 括号生成

思路:

一个原则:左括号要优先于右括号出现。

所以优先填n个左括号,再一个个回溯,尝试填右括号。

class Solution {private List<String> res = new ArrayList<>();private char[] path;private int n;public List<String> generateParenthesis(int n) {path = new char[n * 2];this.n = n;dfs(0, 0);return res;}// 目前填了 left 个左括号,right 个右括号private void dfs(int left, int right) {// 填完 2n 个括号if (right == n) {res.add(new String(path));return;}// 先填左括号if (left < n) {// 直接覆盖,所以不用回溯path[left + right] = '(';dfs(left + 1, right);}// 可以填右括号if (right < left) {path[left + right] = ')';dfs(left, right + 1);}}
}

79. 单词搜索

思路:

  • 找到一个第一个字母匹配的格子,从这里开始dfs进去搜。
  • 定义 dfs(i,j,k) 表示当前在 board[i][j] 这个格子,要匹配 word[k],返回在这个状态下最终能否匹配成功(搜索成功)。
    1. 不匹配,返回false
    2. 如果匹配完了,返回true
    3. 匹配到中间,k位置已经匹配好了,先标记board=0表示已访问。
      • 搜索格子周边的四个格子,如果没出界的话,dfs进去,探索board[x][y]和word[k+1]是不是相等。
        • 如果下面格子返回true,表示最终找到了(因为是深搜,已经搜到结尾了),直接向上返回true
    4. 如果周边四个格子都返回false,要恢复现场.把board标记还原回去,再return false
class Solution {private static final int[][] DIRS = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };private char[] word;private char[][] board;public boolean exist(char[][] board, String word) {this.board = board;this.word = word.toCharArray();// 遍历board每一个格子for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[0].length; j++) {if (board[i][j] == this.word[0] && dfs(i, j, 0)) {return true;}}}return false;}// 表示当前在 board[i][j] 这个格子,要匹配 word[k]private boolean dfs(int i, int j, int k) {if (board[i][j] != word[k]) {return false;}// 匹配完了,返回trueif (k == word.length - 1) {return true;}// 标记,避免重复访问board[i][j] = 0;// 遍历周围的四个格子for (int[] d : DIRS) {int x = i + d[0];int y = j + d[1];if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) {continue;}// 如果下面格子返回true,表示最终找到了(因为是深搜,已经搜到结尾了),直接向上返回trueif (dfs(x, y, k + 1)) {return true;}}// 走到这里,从这里出发不能找到,return false之前,要恢复现场.把board标记还原回去board[i][j] = word[k];return false;}
}

灵茶山艾府:

还可以优化的点:

  1. 统计board和word的字母出现次数,但凡word有一个字母的出现次数比board多,都不可能完成匹配,直接返回false,不用dfs了
  2. 检查word的首端字母和尾端字母,谁在board的出现频次高。如果首端的出现次数明显多于尾端,那么reverse这个word,这样能减少递归次数。

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

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

相关文章

高并发场景下的“命令执行”注入绕道记

环境&#xff1a;CentOS 8 OpenResty 1.21 PHP-FPM 8.0 背景&#xff1a;营销团队上线了一个“图片裁剪”接口&#xff0c;参数直接拼进 shell_exec&#xff0c;结果被打成“矿机”。1. 发现&#xff1a;流量突增 30 倍&#xff0c;却不见数据库慢查询 iftop -i eth0出站 1.8…

【modbus学习】

Modbus通信&#xff08;源于施耐德&#xff09;串行链路&#xff1a;RTU&#xff08;传输大量数据&#xff0c;适合工业&#xff09;、ASCII&#xff08;少量数据&#xff0c;适合计算机&#xff09;TCP/IP&#xff1a;TCP&#xff08;传输严谨&#xff0c;效率低&#xff09;、…

Redis单线程模型为什么快?

Redis的单线程模型指的是redis只使用一个线程来出来所有的命令式指令&#xff0c;但是不是意味着redis内部就只使用一个线程来处理所有的任务。都知道redis是一个客户端-服务器的程序&#xff0c;那么redis就只有一个服务器&#xff0c;但是有多个客户端&#xff0c;就像mysql一…

前端安全攻防:XSS, CSRF 等常见威胁的防范与检测指南

在如今高度互联的 Web 应用世界里&#xff0c;前端安全不再是可有可无的选项&#xff0c;而是构建可信赖、健壮应用的基石。随着 Web 技术的发展&#xff0c;攻击者们也变得越来越狡猾&#xff0c;前端遭受的攻击手段层出不穷。其中&#xff0c;跨站脚本攻击 (XSS) 和跨站请求伪…

Scikit-learn Python机器学习 - 特征降维 压缩数据 - 特征选择 - 移除低方差特征(VarianceThreshold)

锋哥原创的Scikit-learn Python机器学习视频教程&#xff1a; 2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程主要讲解基于Scikit-learn的Python机器学习知识&#xff0c;包括机器学习概述&#xff0c;特征工程(数据…

C#(链表创建与原地反转)

链表创建&#xff08;C#&#xff09; 在C#中&#xff0c;链表可以通过自定义节点类实现。每个节点包含数据域和指向下一个节点的引用。 public class ListNode {public int val;public ListNode next;public ListNode(int val0, ListNode nextnull) {this.val val;this.next…

Android --- AOSP源码导入Android Studio

AOSP代码量庞大&#xff0c;为了开发的方便&#xff0c;我们需要导入到android studio中&#xff0c;其中关键的一 项就是配置跳转。尤其是对于Framework开发来说生成 ipr,iml 工程文件make idegen ./development/tools/idegen/idegen.sh会生成如下文件首先需要修改ipr和iml文件…

游戏中的设计模式——第一篇 设计模式简介

前言 对于设计模式&#xff0c;相信很多开发者并不陌生&#xff0c;我在学习过程中希望把自己的一些总结和心得体会与你分享。 本专栏主要将重点放在设计模式在游戏中的应用&#xff0c;会结合大家熟悉的游戏场景和功能阐述设计模式在该处应用的好处。因为设计模式很多&#xf…

SpringBoot + RustFS 实现文件切片极速上传技术

本文将手把手教你如何通过 SpringBoot 和 RustFS 构建高性能文件切片上传系统&#xff0c;解决大文件传输的痛点&#xff0c;实现秒传、断点续传和分片上传等高级功能。 目录 一、为什么选择 RustFS SpringBoot&#xff1f; 二、环境准备与部署 2.1 安装 RustFS 2.2 Sprin…

在Word和WPS文字中便捷切换英文段落大小写

在Word和WPS文字中编辑英文段落时&#xff0c;有时候英文字母的大小写不规范&#xff0c;或者需要把某一段全部改为大写字母怎么办&#xff1f;使用ShiftF3组合键即可快速在三种模式中切换&#xff1a;全部大写、全部小写、首字母大写——其中首字母大写的Word是每一句话的第一…

成都金牛区哪里租好办公室?国际数字影像产业园享税收优惠

在成都金牛区租赁优质办公室&#xff0c;国际数字影像产业园凭借其享有的税收优惠政策&#xff0c;成为了许多企业的首选之地。税收优惠对于租赁办公室的企业来说&#xff0c;是一笔不小的成本节省。国际数字影像产业园针对入驻企业提供的税收优惠政策&#xff0c;能在企业运营…

CSS `:is()` `:where()` 实战指南:简化选择器,提升可维护性

&#x1f3af; CSS :is() & :where() 实战指南&#xff1a;简化选择器&#xff0c;提升可维护性你是否在项目中写过一大串重复的选择器&#xff1f;比如&#xff1a; h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem; }这样的代码既冗长又难维护。 现在 CSS 提供了 :is() 和…

Linux I/O 访问架构深入分析

Linux I/O 访问架构深入分析 目录 概述I/O 架构层次核心数据结构I/O 处理流程VFS 虚拟文件系统块设备I/O字符设备I/O内存映射I/O异步I/O机制I/O调度器调试工具与方法性能优化策略 概述 Linux I/O 系统是一个多层次、高度抽象的架构&#xff0c;旨在为应用程序提供统一的文件访问…

Linux:6_基础IO

基础IO 一.理解"文件" 文件分类 1.内存级(被打开)文件 2.磁盘级文件 1. 狭义理解 文件在磁盘里磁盘是永久性存储介质&#xff0c;因此文件在磁盘上的存储是永久性的磁盘是外设 (即是输出设备也是输入设备)磁盘上的文件本质是对文件的所有操作&#xff0c;都是对外…

Coze源码分析-资源库-删除插件-前端源码-核心逻辑

删除插件逻辑 1. 删除操作入口组件 删除插件操作主要通过 usePluginConfig hook 中的 renderActions 方法实现&#xff0c;该方法返回 TableAction 组件来处理表格行的操作。 文件位置&#xff1a;frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地状态(Flink 1.x)

最初的架构将状态以 JVM Heap 对象的形式存储在 TaskManager 的内存中。对于小规模数据集&#xff0c;这种方式效果良好&#xff0c;但随着状态大小的增长超出内存&#xff0c;将所有状态保存在内存中变得成本高昂且不稳定。 为了解决状态规模增长的问题&#xff0c;引入了一种…

跨境金融数据对接实践:印度NSE/BSE股票行情API集成指南

跨境金融数据对接实践&#xff1a;印度NSE/BSE股票行情API集成指南 关键词&#xff1a;印度股票数据对接 NSE实时行情 BSE证券接口 金融API开发 Python请求示例一、印度股市数据源技术解析&#xff08;核心价值&#xff09; 印度两大交易所数据获取难点&#xff1a; 时区差异&a…

AFSim2.9.0学习笔记 —— 1、AFSim及完整工具介绍(文末附:完整afsim2.9.0源码、编译好的完整工具包、中文教材等)

&#x1f514; AFSim2.9.0 相关技术、疑难杂症文章合集&#xff08;掌握后可自封大侠 ⓿_⓿&#xff09;&#xff08;记得收藏&#xff0c;持续更新中…&#xff09; AFSim介绍 AFSim&#xff08;Advanced Framework for Simulation Integration & Modeling【高级仿真集成与…

ArcGIS学习-18 实战-降雨量空间分布插值分析

设置环境加载要素投影查看要素&#xff0c;发现均不是投影数据&#xff0c;但都是地理坐标都是WGS1984使用工具进行批量投影然后新建空地图&#xff0c;重新加载确认图层的投影与栅格数据一致插值样条法得到反距离权重法插值得到克里金法插值得到

HarmonyOS应用开发:深入理解声明式UI与弹窗交互的最佳实践

HarmonyOS应用开发&#xff1a;深入理解声明式UI与弹窗交互的最佳实践 引言 随着HarmonyOS 4.0的发布及后续版本的演进&#xff0c;华为的分布式操作系统已经进入了全新的发展阶段。基于API 12及以上的开发环境为开发者提供了更强大、更高效的开发工具和框架。在HarmonyOS应用…