力扣100题——杂题

news/2024/9/19 0:43:55/ 标签: leetcode, 算法

回溯——分割回文串

题目

131. 分割回文串 - 力扣(LeetCode)

思路

问题拆解

  • 回文串定义:回文串是指从前往后和从后往前读都是相同的字符串。例如,"aba" 和 "racecar" 都是回文串。

  • 递归 + 回溯思想:我们可以逐步检查字符串的每一个前缀是否是回文串,如果是回文串,则将其作为一个可能的子串继续进行递归,检查剩余部分字符串的可能性。我们需要将所有可能的分割方案保存下来。

  • 回溯:递归中,当某一分支无法满足条件时,我们需要回溯,取消之前的选择,尝试其他分割方式。

实现思路

  • 从字符串的第一个字符开始,逐步检查每一个前缀是否是回文串。
  • 如果是回文串,则将该前缀作为一个可能的子串,并递归处理剩余的字符串。
  • 当字符串被完全分割(即没有剩余字符串时),将该分割方案保存起来。
  • 使用回溯来尝试不同的分割方案。

步骤

  • 判断回文:首先我们需要一个辅助函数来判断某个字符串的某个区间是否为回文串。
  • 递归与回溯:我们需要递归遍历字符串的每个前缀,并尝试将其作为一个回文串。
  • 终止条件:当遍历到字符串的末尾时,说明当前路径已经找到一个可行的分割方案,将其加入结果中。

代码

 public List<List<String>> partition(String s) {List<List<String>> res = new ArrayList<List<String>>();if(s == null || s.isEmpty())return res;if(s.length()==1){ArrayList<String> strings = new ArrayList<String>();strings.add(s);res.add(strings);}List<String> stringList = new ArrayList<>();fun(s,stringList,res,0);return res;}private void fun(String s, List<String> stringList, List<List<String>> res, int start) {if(start == s.length()){List<String> now = new ArrayList<>(stringList);res.add(now);}for(int i=start;i<s.length();i++){String str = s.substring(start,i+1);if(check(str)){stringList.add(str);fun(s,stringList,res,i+1);stringList.removeLast();}}}private boolean check(String s) {char[] charArray = s.toCharArray();int i=0,j=s.length()-1;while(i<j){if(charArray[i]!=charArray[j]){return false;}i++;j--;}return true;}public static void main(String[] args) {test0910 test = new test0910();System.out.println(test.partition("aabcd"));}

回溯——N皇后

题目

51. N 皇后 - 力扣(LeetCode)

思路

  • 基本思想

    • 回溯法:N 皇后问题的本质是一个排列组合问题。通过递归与回溯的方式,可以在棋盘的每一行中放置一个皇后,并检查是否满足约束条件(没有冲突)。一旦发现一个合法的解,就将它加入结果集中。
    • 逐行放置:我们在每一行尝试放置皇后,然后检查它是否与之前放置的皇后冲突。如果不冲突,则继续放置下一行的皇后;如果发生冲突,就回溯到上一个位置,重新选择。
  • 冲突检测

    • :每行只能放一个皇后,因此我们只需要在每一行选择一个位置。
    • :通过一个布尔数组 row[i] 来标记第 i 列是否已经放置过皇后。
    • 主对角线:主对角线上的元素坐标差(x - y)是相等的。我们可以使用一个布尔数组 djx1[x - y + n - 1] 来标记主对角线是否被占用。
    • 副对角线:副对角线上的元素坐标和(x + y)是相等的。我们可以使用另一个布尔数组 djx2[x + y] 来标记副对角线是否被占用。
  • 递归与回溯

    • 在每一行放置一个皇后时,首先判断当前列和对角线是否已经被占用。
    • 如果合法,则放置皇后,并递归处理下一行。
    • 如果不合法或递归失败,则回溯到上一行,尝试其他可能的位置。
    • 一旦某一行的所有位置都尝试过且没有成功,则进行回溯,撤销上一行的皇后放置,继续尝试其他位置。
  • 状态保存

    • 使用一个数组 queen[] 来记录每一行皇后放置的位置。例如,queen[i] = j 表示在第 i 行的第 j 列放置了皇后。
    • 通过 queen[] 数组可以方便地生成最终的棋盘布局。

代码

public List<List<String>> solveNQueens(int n) {List<List<String>> res = new ArrayList<>();int[] queen = new int[n];boolean[] row = new boolean[n];boolean[] djx1 = new boolean[2*n-1];boolean[] djx2 = new boolean[2*n-1];fun3(res,queen,row,djx1,djx2,0,n);return res;}private void fun3(List<List<String>> res,int[] queen, boolean[] row, boolean[] djx1, boolean[] djx2, int x, int n) {if(x==n){res.add(trans(queen,n));return;}for(int i=0;i<n;i++){if(row[i]||djx1[x-i+n-1]||djx2[i+x]){continue;}row[i] = true;queen[x]=i;djx1[x-i+n-1]=true;djx2[i+x]=true;fun3(res,queen,row,djx1,djx2,x+1,n);row[i]=false;djx1[x-i+n-1]=false;djx2[i+x]=false;}}private List<String> trans(int[] queen, int n) {List<String> board = new ArrayList<>();for (int i = 0; i < n; i++) {char[] row = new char[n];for (int j = 0; j < n; j++) {row[j] = '.';  // 初始为空位}row[queen[i]] = 'Q';  // 将皇后放置在第 i 行的正确列board.add(new String(row));  // 将当前行加入到棋盘中}return board;}

二分查找——寻找两个正序数组的中位数

题目

4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

思路

对数组进行合并然后找出中位数

但是这样时间复杂度会来到O(m+n)

优化后的思路

为了找到两个有序数组的中位数,我们不需要合并两个数组。可以通过二分查找来确定两个数组的中位数,利用其有序性高效解决

代码

简单代码

public double findMedianSortedArrays(int[] nums1, int[] nums2) {int n = nums1.length+nums2.length;int[] nums = new int[n];int k=0,m=0;for(int i=0;i<n;i++){if(k==nums1.length){nums[i]=nums2[m];m++;continue;}if(m==nums2.length){nums[i]=nums1[k];k++;continue;}if(k<nums1.length&&m< nums2.length&&nums1[k]<nums2[m]){nums[i] = nums1[k];k++;}else if(k<nums1.length&&m< nums2.length&&nums2[m]<=nums1[k]){nums[i] = nums2[m];m++;}}double result = 0.0;if(n%2==0){result = ((double) nums[n/2]+(double) nums[n/2-1])/2;}else{result = (double) nums[n/2];}return result;}

优化后的代码

public double findMedianSortedArrays(int[] nums1, int[] nums2) {// 确保 nums1 是较短的数组if (nums1.length > nums2.length) {return findMedianSortedArrays(nums2, nums1);}//计算总的左侧元素个数int m = nums1.length;int n = nums2.length;int totalLeft = (m + n + 1) / 2;//二分查找int left = 0, right = m;while (left < right) {int i = (left + right + 1) / 2;int j = totalLeft - i;if (nums1[i - 1] > nums2[j]) {right = i - 1;} else {left = i;}}int i = left;int j = totalLeft - i;//分割点处的情况分析int nums1LeftMax = (i == 0) ? Integer.MIN_VALUE : nums1[i - 1];int nums1RightMin = (i == m) ? Integer.MAX_VALUE : nums1[i];int nums2LeftMax = (j == 0) ? Integer.MIN_VALUE : nums2[j - 1];int nums2RightMin = (j == n) ? Integer.MAX_VALUE : nums2[j];//判断中位数if ((m + n) % 2 == 1) {return Math.max(nums1LeftMax, nums2LeftMax);} else {return (Math.max(nums1LeftMax, nums2LeftMax) + Math.min(nums1RightMin, nums2RightMin)) / 2.0;}}

栈——有效的括号

题目

20. 有效的括号 - 力扣(LeetCode)

思路

经典题目,用栈就好了,遇到左括号就入栈,遇到右括号就出栈。最后栈为空则有效,非空则无效。

代码

 public boolean isValid(String s) {if (s == null || s.length() == 0) {return true;}Stack<Character> stack = new Stack<>();char[] array = s.toCharArray();for (char c : array) {if (c == '(' || c == '[' || c == '{') {stack.push(c);} else if (c == ')' || c == ']' || c == '}') {if (stack.isEmpty()) {return false;}char top = stack.pop();if (c == ')' && top != '(')return false;if (c == ']' && top != '[')return false;if (c == '}' && top != '{')return false;}}return stack.isEmpty();}

栈——字符串解码

题目

394. 字符串解码 - 力扣(LeetCode)

思路

使用 栈(Stack) 来解决这个问题

  1. 使用两个栈

    • 一个栈保存数字,用来记录重复次数。
    • 另一个栈保存当前的字符串,用来记录已经解析的部分。
  2. 遍历字符串

    • 当遇到数字时,解析出完整的数字。
    • 当遇到 [ 时,表示要开始处理一个新的编码部分,当前字符串应该入栈等待。
    • 当遇到 ] 时,表示结束了一个编码部分,取出栈顶的数字和字符串,重复并连接当前的部分。
    • 当遇到普通字符时,直接将字符追加到当前的字符串中。
  3. 时间复杂度分析

    • 每个字符都会被遍历一次,且每个字符在栈中进出一次,因此时间复杂度为 O(n),其中 n 是字符串的长度。

代码

public String decodeString(String s) {if(s.isEmpty()){return s;}Stack<Integer> integerStack = new Stack<>();Stack<StringBuilder> stringStack = new Stack<>();char[] chars = s.toCharArray();StringBuilder sb = new StringBuilder();int k = 0;for (char aChar : chars) {if (aChar == '[') {integerStack.push(k);stringStack.push(sb);sb = new StringBuilder();k = 0;} else if (aChar == ']') {int temp = integerStack.pop();StringBuilder str = stringStack.pop();for (int j = 0; j < temp; j++) {str.append(sb);}sb = str;} else if (Character.isDigit(aChar)) {k = k * 10 + (aChar - '0');} else {sb.append(aChar);}}return sb.toString();}


http://www.ppmy.cn/news/1525516.html

相关文章

网络学习-eNSP配置NAT

NAT实现内网和外网互通 #给路由器接口设置IP地址模拟实验环境 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]interface gigabitethernet 0/0/0 [Huawei-Gigabi…

HTML中的文字与分区标记

1.font标记&#xff1a;用来设置文字的字体&#xff0c;大小&#xff0c;颜色&#xff0c;等属性 <!--font:font标记用来设置字体大小颜色属性size:设置字号&#xff0c;默认是3号&#xff0c;1表示4号&#xff0c;-1表示2号&#xff0c;取值范围是[1,7]或[-7,-1]color:设置…

websim.ai 体验过程+感受

体验 websim.ai 后感觉网站更倾向于客户提需求或者满足客户需求的可视化页面阶段&#xff0c;比较像设计界面。就是一直命令AI添加功能&#xff0c;然后它绘图。导出的代码是单个HTML文件&#xff0c;用前端三件套写的。 体验过程 ① Create a relationship diagram between …

chrome浏览器如何设置自动播放音视频

使用场景&#xff1a; 有些场景需要打开页面后&#xff0c;自动播放视频或者视频流&#xff0c;这时候发现无法播放&#xff0c;打开浏览器控制台发现有下面的错误提示&#xff1a;NotAllowedError: play() failed because the user didnt interact with the document first 。…

金融壹账通:智能面审解决方案“大显身手”

深度伪造技术Deepfake,是“Deep Machine Learning(深度机器学习)”与“Fake Photo(假照片)”两个词的合成词,主要指用AI深度学习的技术,合成某个人的图片或视频、甚至声音,最常见的便是AI换脸,此外还包括语音模拟、人脸合成、视频生成等。如今,AI换脸与“假人骗贷”正成为相当常…

文件误删危机应对:数据恢复全解析

文件误删&#xff1a;数字化时代的隐形挑战 在数字化的浪潮中&#xff0c;文件已成为我们工作、学习和生活中不可或缺的一部分。它们记录着我们的思想、成果与回忆&#xff0c;是连接现实与虚拟世界的桥梁。然而&#xff0c;这份便捷与高效背后&#xff0c;却隐藏着文件误删这…

SpringBoot + Vue + ElementUI 实现 el-table 分页功能详解

引言 在现代Web应用程序开发中&#xff0c;前后端分离架构越来越受欢迎。这种架构使得前端和后端开发可以并行进行&#xff0c;提高了开发效率。本文将详细讲解如何使用SpringBoot作为后端&#xff0c;Vue.js和ElementUI作为前端&#xff0c;实现一个带分页功能的数据表格&…

算法练习题16——leetcode73矩阵置零

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。 解题思路 我们需要找出矩阵中哪些位置有 0&#xff0c;然后将这些位置所在的行和列上的所有元素都设为 0。 可以分为以下几个步骤&#xff1a; 扫描矩阵&…

基于less和scss 循环生成css

效果 一、less代码 复制代码 item-count: 12; // 生成多少个 .item 类.item-loop(n) when (n > 0) {.icon{n} {background: url(../../assets/images/menu/icon{n}.png) no-repeat;background-size: 100% 100%;}.item-loop(n - 1);}.item-loop(item-count);二、scss代码 f…

Autosar(Davinci) --- 创建一个S/R类型的port(下)

前言: 前面章节我们讲解了S/R类型的Port如何创建,这一章节,我们着重讲一下生成的代码,以及我们如何添加代码让这些门与灯之间的关系产生连接。 一、CtSaDoor.c 在【Rte.c】的【IO_TASK】中我们可以看到,反复的判断Rte_Ev_Cyclic_IO_Task_0_200ms这个条件是否成立,当200…

系统架构设计师【真题论文】: 论企业集成平台的技术与应用(包括解题思路和经典范文)

更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 真题题目(2015年试题4)解题思路精品范文赏析摘要正文总结真题题目(2015年试题4) 题目:论企业集成平台的技术与应用 企业集成平台是一个支持复杂信息环境下信息系统开发、集成和协同运行的软件支撑环境。它基于各…

IOS Siri和快捷指令打开app

使用场景 需要Siri打开应用或者在自定义快捷指令打开应用&#xff0c;并携带内容进入应用。 1.创建Intents文件 1.1 依次点开File->New->File 1.2 搜索intent关键字找到 SiriKit Intent Definition File文件 1.3 找到刚才创建的Intent文件&#xff0c;点击然后New Inte…

服务器与个人计算机之间的区别

服务器和个人计算机作为人们日常生活中经常会用到的计算机系统&#xff0c;在功能与用途方面还是有着明显的区别的&#xff0c;今天小编就主要来为大家介绍一下服务器与个人计算机之间的区别有哪些&#xff1f; 个人计算机相对于服务器来说&#xff0c;更加注重与用户的体验感和…

C++11第四弹:包装器

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

企业数字化转型建设方案(数据中台、业务中台、AI中台)(可编辑的188页WORD)

引言&#xff1a;企业数字化转型是一个复杂而长期的过程&#xff0c;其核心在于通过数据中台、业务中台和AI中台的建设&#xff0c;推动企业实现全面的数字化升级。 方案介绍&#xff1a;企业数字化转型建设方案中的数据中台是企业数字化转型的核心基础设施&#xff0c;负责数…

MATLAB基础语法知识

环境的配置等等就不写了&#xff0c;网上还是有很多资源可以找&#xff0c;而且正版的要付费&#xff0c;我也是看的网上的搞定的。 一&#xff0c;初识MATLAB 1.1 MATLAB的优势 不需要过多了解各种数值计算方法的具体细节和计算公式&#xff0c;也不需要繁琐的底层编程。可…

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析&#xff1a; url中含有特殊字符 中文未编码 都有可能导致URL转换失败&#xff0c;所以需要对url编码处理 如下&#xff1a; guard let allowUrl webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时&a…

华为23年笔试题

消息传输 题目描述 在给定的 m x n (1 < m, n < 1000) 网格地图 grid 中&#xff0c;分布着一些信号塔&#xff0c;用于区域间通信。 每个单元格可以有以下三种状态&#xff1a; 值 0 代表空地&#xff0c;无法传递信号&#xff1b; 值 1 代表信号塔 A&#xff0c;…

Iceberg与SparkSQL查询操作整合

前言 spark操作iceberg之前先要配置spark catalogs,详情参考Iceberg与Spark整合环境配置。 Iceberg使用Apache Spark的DataSourceV2 API来实现数据源和catalog。 使用SQL查询 查询的时候表要按照:catalog.数据库.表名的格式 SELECT * FROM prod.db.table; -- catalog: p…

C++:线程库

C&#xff1a;线程库 threadthreadthis_threadchrono 引用拷贝问题 mutexmutextimed_mutexrecursive_mutexlock_guardunique_lock atomicatomicCAS condition_variablecondition_variable thread 操作线程需要头文件<thread>&#xff0c;头文件包含线程相关操作&#xf…