LeetCode 852, 20, 51

目录

  • 852. 山脉数组的峰顶索引
    • 题目链接
    • 标签
    • 二分
      • 思路
      • 代码
    • 三分
      • 思路
      • 代码
  • 20. 有效的括号
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 51. N 皇后
    • 题目链接
    • 标签
    • 思路
      • 回溯
      • 如何保证皇后之间无法互相攻击
    • 代码

852. 山脉数组的峰顶索引

题目链接

852. 山脉数组的峰顶索引

标签

数组 二分查找

二分

思路

本题的 arr先递增,后递减 的,共有如下两种情况:

对于第一种情况:中间值的前一个值 大于 中间值,可以发现:最大值在左子区间上

最大值在左子区间上
对于第二种情况:中间值的前一个值 小于 中间值,可以发现:最大值在右子区间上
最大值在右子区间上

代码

class Solution {public int peakIndexInMountainArray(int[] arr) {int left = 0, right = arr.length - 1;while (left < right) {int mid = left + (right - left + 1 >> 1); // 中间值的索引if (arr[mid - 1] < arr[mid]) { // 中间值的前一个值 小于 中间值left = mid; // 最大值在右子区间上} else { // 中间值的前一个值 大于 中间值right = mid - 1; // 最大值在左子区间上}}return left;}
}

三分

思路

寻找峰值是 三分 的经典用法,三分二分 类似,都是将区间平均分,不过 三分 把区间分成 三份,比较 左三等分点 和 右三等分点 指向的值 的大小,从而决定选择查找哪个区间。

左三等分点指向的值 小于 右三等分指向的值 时,说明 最大值点在右边的 2 3 \frac{2}{3} 32 区间
alt text
左三等分点指向的值 大于 右三等分指向的值 时,说明 最大值点在左边的 2 3 \frac{2}{3} 32 区间
alt text

代码

class Solution {public int peakIndexInMountainArray(int[] arr) {int left = 0, right = arr.length - 1;while (left < right) {int midL = left + (right - left) / 3, midR = right - (right - left) / 3;if (arr[midL] < arr[midR]) { // 左三等分点指向的值 小于 右三等分指向的值left = midL + 1; // 最大值点在右边的 2/3 区间} else { // 左三等分点指向的值 大于 右三等分指向的值right = midR - 1; // 最大值点在左边的 2/3 区间}}return left;}
}

20. 有效的括号

题目链接

20. 有效的括号

标签

栈 字符串

思路

有效字符串需满足:

  1. 左括号必须用 相同类型 的右括号闭合。
  2. 左括号必须以 正确的顺序 闭合。这就说明 "[(])" 不是有效字符串,而 "([])" 是有效字符串。
  3. 每个 右括号都有一个对应的相同类型的左括号。

注意有效字符串的以上三个条件,尤其是第二个条件。由 "[(])" 不是有效字符串可知:对于一个右括号,它要匹配它前面的最后一个左括号。由 "([])" 是有效字符串可知:被右括号成功匹配之后的左括号可以视而不见

这样的判断驱使着我们使用 这种数据结构来存储左括号,对于字符串 s 中的每一个字符 ch (顺序遍历),有以下的操作:

  • 如果 ch 是左括号,直接将其放入栈中。
  • 如果 ch 是右括号,判断栈顶元素 (这里的栈顶元素就是 ch 前面的最后一个左括号) 是否能与 ch 匹配,如果不能,则返回 false;否则将匹配成功的左括号 (即栈顶元素) 弹出栈,并继续遍历下一个字符。
  • 此外,可能会遇到 ch 是右括号时,栈为空 的情况,例如 "]", "()}",对于第一个字符串,当 ch == ']' 时,栈为空;对于第二个字符串,当 ch == '}' 时,栈为空。此时直接返回 false 即可。

遍历完所有字符后,不能直接返回 true,因为此时栈可能不为空,例如对于 "[({",栈最后还存储着三个左括号,此时应该返回 false;如果最后的栈为空,则可以放心地返回 true

代码

class Solution {public boolean isValid(String s) {LinkedList<Character> stack = new LinkedList<>(); // 储存 左括号 的栈for (char ch : s.toCharArray()) { // 从字符串 s 中拿出字符 ch 进行操作if (ch == '(' || ch == '{' || ch == '[') { // 如果是左括号之一stack.push(ch); // 则将其放入栈中continue; // 不进行接下来的操作}// 否则 ch 是右括号,需要给它匹配相应的左括号if (stack.isEmpty()) { // 如果栈中没有元素return false; // 则无法匹配,返回 false}// 否则栈中有元素,这时开始匹配if ((ch == ')' && stack.peek() != '(')              // 如果 ')' 匹配不到 '('|| (ch == '}' && stack.peek() != '{')       // 或者 '}' 匹配不到 '{'|| (ch == ']' && stack.peek() != '[')) {    // 或者 ']' 匹配不到 '['return false; // 则 ch 没有 正确顺序的左括号 与之匹配,返回 false}// 否则 ch 有 正确顺序的左括号 与之匹配stack.pop(); // 将 匹配过的左括号 从栈中删除}return stack.isEmpty(); // 如果栈中还有元素,说明没有匹配成功,返回 false;否则返回 true}
}

51. N 皇后

题目链接

51. N 皇后

标签

数组 回溯

思路

回溯

本题的 困难 标签有些夸张了,使用基本的 回溯 就可以解决。

题目要求把皇后放到无法攻击的位置上,皇后能攻击到的对象为 同一行同一列同一左斜线 (左斜线指的是从 左上右下 的斜线↘️)、同一右斜线 (右斜线指的是从 右上左下 的斜线↙️) 的对象。既然要求在 n×n 的棋盘上要放置 n 个皇后,那么 每一行和每一列都必须有皇后,并且在一条 左斜线右斜线 上不能同时存在多个皇后。

可以想到,使用 回溯每一行 进行操作:在 每一行 中枚举 每一列 来放置皇后,前提是 在 这一列、这一左斜线、这一右斜线 上不存在皇后,如果能放置,就按照 回溯 的常规做法:

  • 将皇后放到棋盘的当前位置上。
  • 标记皇后在这一列、这一左斜线、这一右斜线上。
  • 放置下一个皇后。
  • 取消标记。
  • 将当前皇后从棋盘上移除。

完全可以改变回溯的策略,即 对 每一列 进行操作:在 每一列 中枚举 每一行 来放置皇后。

如何保证皇后之间无法互相攻击

本题除 回溯 思想比较难想到之外,还有一个难点:如何保证皇后之间无法互相攻击?上面其实已经提到过了,就是防止皇后被放到相同的 行、列、左斜线 或 右斜线 上,行和列都很直观,但左、右斜线就不是那么直观了,得使用行和列进行简单的计算。

下图是一个 4×4 的棋盘,标记了每个元素所对应的左、右斜线的编号,从 0 开始,到 2 * 4 - 1 - 1 = 6 结束,可以得到:n×n 的棋盘上,对于第 i 行、第 j 列的元素,它的左斜线的编号为 n - (i - j) - 1,右斜线的编号为 i + j
四皇后问题

代码

class Solution {public List<List<String>> solveNQueens(int n) {// 初始化本对象的属性this.n = n;this.col = new boolean[n];this.lSlash = new boolean[2 * n - 1];this.rSlash = new boolean[2 * n - 1];this.table = new char[n][n];for (char[] row : table) { // 将棋盘的每行都填充为 '.'Arrays.fill(row, '.');}dfs(0);return res;}private List<List<String>> res = new ArrayList<>(); // 存储结果的集合private char[][] table; // 棋盘private int n; // 棋盘的 行数 和 列数private boolean[] col; // 判断 某一列 是否有皇后private boolean[] lSlash; // 判断 某一左斜线(左上 到 右下) 是否有皇后private boolean[] rSlash; // 判断 某一右斜线(右上 到 左下) 是否有皇后// 在索引为 i 的行上,放置第 i+1 个皇后private void dfs(int i) {if (i == n) { // 如果已经放置够了 n 个皇后// 将 放置皇后的棋盘 加入到结果集合中List<String> ans = new ArrayList<>();for (char[] row : table) {ans.add(new String(row));}res.add(ans);return; // 并直接返回}for (int j = 0; j < n; j++) { // 枚举所有的 列int ls = n - (i - j) - 1; // 当前行列对应的 左斜线的编号int rs = i + j; // 当前行列对应的 右斜线的编号// 如果 这列、左斜线、右斜线 之一被占,则取消本次放置if (col[j] || lSlash[ls] || rSlash[rs]) {continue;}table[i][j] = 'Q'; // 将皇后放到棋盘的当前位置上col[j] = lSlash[ls] = rSlash[rs] = true; // 标记皇后在这一列、这一左斜线、这一右斜线上dfs(i + 1); // 放置下一个皇后col[j] = lSlash[ls] = rSlash[rs] = false; // 取消标记table[i][j] = '.'; // 将当前皇后从棋盘上移除}}
}

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

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

相关文章

逍遥模拟器安装Magisk和EDXPosed教程

资源下载&#xff1a; 逍遥模拟器安装Magisk和EDXPosed教程 - 多开鸭资源下载&#xff1a; MagiskEDXP教程文件 单独的逍遥模拟器使用的版本EDXPosed打包下载&#xff08;下载之后解压出来一共4个文件&#xff09;&#xff1a; 如果要按本教程安装就务必使用这里的安装包&…

爬虫(一)——爬取快手无水印视频

前言 最近对爬虫比较感兴趣&#xff0c;于是浅浅学习了一些关于爬虫的知识。爬虫可以实现很多功能&#xff0c;非常有意思&#xff0c;在这里也分享给大家。由于爬虫能实现的功能太多&#xff0c;而且具体的实现方式也有所不同&#xff0c;所以这里开辟了一个新的系列——爬虫…

用AI生成Springboot单元测试代码太香了

你好&#xff0c;我是柳岸花开。 在当今软件开发过程中&#xff0c;单元测试已经成为保证代码质量的重要环节。然而&#xff0c;编写单元测试代码却常常让开发者头疼。幸运的是&#xff0c;随着AI技术的发展&#xff0c;我们可以利用AI工具来自动生成单元测试代码&#xff0c;极…

基于单片机的停车场车位管理系统设计

1.简介 停车场车位管理系统是日常中随处可见的一种智能化车位管理技术&#xff0c;使用该技术可以提高车位管理效率&#xff0c;从而减轻人员车位管理工作负荷。本系统集成车牌识别、自动放行、自助缴费等技术&#xff0c;并且具备车位占用状态实时监测与车位数量实时统计、查询…

Java SpringAOP简介

简介 官方介绍&#xff1a; SpringAOP的全称是&#xff08;Aspect Oriented Programming&#xff09;中文翻译过来是面向切面编程&#xff0c;AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是Spring框架中的一个重要内容&#xff0c;是函数式编程的一种衍生…

SpringBatch文件读写ItemWriter,ItemReader使用详解

SpringBatch文件读写ItemWriter&#xff0c;ItemReader使用详解 1. ItemReaders 和 ItemWriters1.1. ItemReader1.2. ItemWriter1.3. ItemProcessor 2.FlatFileItemReader 和 FlatFileItemWriter2.1.平面文件2.1.1. FieldSet 2.2. FlatFileItemReader2.3. FlatFileItemWriter 3…

AI 绘画|Midjourney设计Logo提示词

你是否已经看过许多别人分享的 MJ 咒语&#xff0c;却仍无法按照自己的想法画图&#xff1f;通过学习 MJ 的提示词逻辑后&#xff0c;你将能够更好地理解并创作自己的“咒语”。本文将详细拆解使用 MJ 设计 Logo 的逻辑&#xff0c;让你在阅读后即可轻松上手&#xff0c;制作出…

打包一个自己的Vivado IP核

写在前面 模块复用是逻辑设计人员必须掌握的一个基本功&#xff0c;通过将成熟模块打包成IP核&#xff0c;可实现重复利用&#xff0c;避免重复造轮子&#xff0c;大幅提高我们的开发效率。 接下来将之前设计的串口接收模块和串口发送模块打包成IP核&#xff0c;再分别调用…

【深度学习】FaceChain-SuDe,免训练,AI换脸

https://arxiv.org/abs/2403.06775 FaceChain-SuDe: Building Derived Class to Inherit Category Attributes for One-shot Subject-Driven Generation 摘要 最近&#xff0c;基于主体驱动的生成技术由于其个性化文本到图像生成的能力&#xff0c;受到了广泛关注。典型的研…

深度学习入门——神经网络

前言 神经网络可以帮助自动化设定权重 具体地讲&#xff0c;神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数 从感知机到神经网络 神经网络的例子 中间层aka隐藏层 复习感知机 偏置b 并没有被画出来。如果要明确地表示出b&#xff0c;可以像图3-3那样做…

Large Language Model系列之一:语言模型与表征学习(Language Models and Representation Learning)

语言模型与表征学习&#xff08;Language Models and Representation Learning&#xff09; 1 语言模型 N-Gram模型 from collections import defaultdictsentences [The swift fox jumps over the lazy dog.,The swift river flows under the ancient bridge.,The swift br…

华为1000人校园实验记录

在这里插入代码片1000人校园区网设计 1、配置Eth-trunk实现链路冗余 vlan 900 管理WLAN #接入SW8 操作&#xff1a;sys undo in en sysname JR-SW8 int Eth-Trunk 1 mode lacp-static trunkport g0/0/1 0/0/2 port link-type trunk port trunk allow-pass vlan 200 900 qu vla…

模拟器小程序/APP抓包(Reqable+MUMU模拟器)

一、使用adb连接上MUMU模拟器 打开多开器点击ADB图标 连接模拟器端口&#xff1a; adb connect 127.0.0.1:16384列出已连接的设备&#xff1a; adb devices正常会显示MuMu的设备已连接 二、下载Reqable 1.下载链接&#xff1a;客户端下载 | Reqable 2.文档链接&#xff1a;…

redis基本类型和订阅

redis-cli -h <host> -p <port> -a <password> 其中&#xff0c;< host>是Redis服务器的主机名或IP地址&#xff0c;< port>是Redis服务器的端口号&#xff0c;< password>是Redis服务器的密码&#xff08;如果有的话&#xff09;。 set …

LLM基础模型系列:Prompt-Tuning

------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------ 大型预训练语言模型的规模不断扩大&#xff0c;在许多自然语言处理 &#xff08;NLP&#xff09; 基准测试中取得了最先进的结果。自GPT和BERT开发以来&#xff0c;标准做法一直是在下游…

数字化教育资源如何适应人工智能时代

01 教育资源应动态适应一线教学需求 用好数字化教育资源是一项系统工程&#xff0c;涉及教育教学的各个方面&#xff0c;包括教师和学生的教育观念与技术观念、信息技术素养&#xff0c;以及课程教学改革、教师培训等。还涉及数字化教育资源提供方的服务&#xff0c;如技术支持…

【STM32嵌入式系统设计与开发---拓展】——1_9_1上拉输入和下拉输入

在使用GPIO引脚时&#xff0c;上拉输入和下拉输入的选择取决于外部电路的特性和应用需求。以下是它们各自的应用场景&#xff1a; 1、上拉输入&#xff08;Pull-up Input&#xff09; 用途: 当默认状态需要为高电平时。 避免引脚悬空&#xff08;floating&#xff09;导致的…

计算机网络——网络层(路由选择协议、路由器工作原理、IP多播、虚拟专用网和网络地址转换)

目录 路由选择协议 因特网的路由选择协议特点 路由信息协议RIP RIP衡量目的网络距离 RIP选择路由器的方式 RIP具有以下三个重要特点 RIP的基本工作流程 RIP的距离向量算法 ​编辑 ​编辑 RIP存在的问题——“坏消息传播得慢” RIP的封装 开放最短路径优先协议OSPF…

昇思25天学习打卡营第23天|基于MindSpore的Pix2Pix实现图像转换

Pix2Pix实现图像转换 Pix2Pix概述 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;该模型是由Phillip Isola等作者在2017年CVPR上提出的&#xff0c;可以实现语义/标签到…

【贪心算法】贪心算法30题

一、贪心算法简介 证明贪心策略正确性的常用方法&#xff1a;直接证明、交换论证法、反证法、分类讨论… 二、相关编程题 2.1 柠檬水找零 题目链接 860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 题目描述 算法原理 提示&#xff1a;最优解和贪心解唯一可能不同…