力扣热门算法题 49. 字母异位词分组,50. Pow(x, n),51. N 皇后

49. 字母异位词分组,50. Pow(x, n),51. N 皇后,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.19 可通过leetcode所有测试用例。

目录

49. 字母异位词分组

 解题思路

完整代码

python

Java

50. Pow(x, n)

 解题思路

解题思路

完整代码

python

Java

51. N 皇后

解题思路

解题步骤

完整代码

python

Java


49. 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

 解题思路

        可以使用哈希表来组织字母异位词。哈希表的键将是字符串中字母排序后的结果,而值则是具有相同字母组合的字符串列表。这样,所有的字母异位词都会被映射到相同的键下。具体步骤如下:

  1. 初始化哈希表:创建一个哈希表,用于存储每一组字母异位词。键为排序后的字符串,值为原字符串列表。

  2. 遍历字符串数组:对于数组中的每一个字符串:

    • 将字符串中的字母进行排序。
    • 检查排序后的字符串是否已经作为键存在于哈希表中。
    • 如果存在,将原字符串添加到对应的列表中。
    • 如果不存在,以排序后的字符串为键,创建一个新列表,并将原字符串添加到这个列表中。
  3. 收集结果:遍历哈希表,将所有的值(字符串列表)收集到一个结果列表中。

完整代码

python
class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:anagrams = {}for s in strs:# 对字符串中的字符进行排序sorted_str = ''.join(sorted(s))# 如果排序后的字符串作为键存在,追加原字符串到对应的列表中if sorted_str in anagrams:anagrams[sorted_str].append(s)# 否则,创建新的键值对else:anagrams[sorted_str] = [s]# 返回哈希表中所有值组成的列表return list(anagrams.values())
Java
public class Solution {public List<List<String>> groupAnagrams(String[] strs) {if (strs == null || strs.length == 0) return new ArrayList<>();Map<String, List<String>> map = new HashMap<>();for (String s : strs) {char[] ca = s.toCharArray();Arrays.sort(ca);String keyStr = String.valueOf(ca);if (!map.containsKey(keyStr)) map.put(keyStr, new ArrayList<>());map.get(keyStr).add(s);}return new ArrayList<>(map.values());}public static void main(String[] args) {Solution solution = new Solution();String[] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};List<List<String>> result = solution.groupAnagrams(strs);System.out.println(result);}
}

50. Pow(x, n)

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

 解题思路

        实现 pow(x, n) 函数,我们可以利用"快速幂"算法以减少计算的次数。快速幂算法通过将指数折半分解,使得我们不必一步一步地乘以 x,而是可以快速达到目标指数。这个方法在处理非常大的指数时特别有效。

解题思路

  1. 特殊情况处理:如果 x 为 0,直接返回 0(考虑到 0 的任何正指数都是 0)。如果 n 为 0,根据定义返回 1。

  2. 处理负指数:如果 n 为负数,可以先计算 x-n 次幂,然后取其倒数。这样可以转化为正指数的情况处理。

  3. 快速幂递归:使用递归函数计算 x^n。如果 n 是偶数,x^n 可以分解为 (x^(n/2))^2;如果 n 是奇数,则可以分解为 x * (x^(n-1))。这样每次递归可以把问题规模减半,直到 n 为 1 或者特殊情况。

  4. 返回结果:根据上述递归过程计算结果。

完整代码

python
class Solution:def myPow(self, x: float, n: int) -> float:# 递归函数定义def fastPow(x, n):# 递归终止条件if n == 0:return 1.0# 计算 x^(n/2)half = fastPow(x, n // 2)# 根据 n 的奇偶性返回结果if n % 2 == 0:return half * halfelse:return half * half * x# 处理 n 为负的情况if n < 0:x = 1 / xn = -n# 调用快速幂函数return fastPow(x, n)
Java
public class Solution {private double fastPow(double x, long n) {if (n == 0) {return 1.0;}double half = fastPow(x, n / 2);if (n % 2 == 0) {return half * half;} else {return half * half * x;}}public double myPow(double x, int n) {long N = n;if (N < 0) {x = 1 / x;N = -N;}return fastPow(x, N);}public static void main(String[] args) {Solution solution = new Solution();double x = 2.00000;int n = 10;System.out.println(solution.myPow(x, n));}
}

51. N 皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例 1:

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[["Q"]]

解题思路

        解决 n 皇后问题通常使用回溯法,这是一种通过递归遍历所有可能情况来寻找所有解的算法。该问题的关键在于如何放置皇后以避免相互攻击,这意味着在同一行、同一列或者两个主要对角线上不能有两个皇后。

解题步骤

  1. 初始化棋盘:创建一个 n x n 的棋盘,初始时全部填充为 '.',表示所有位置都是空的。

  2. 递归放置皇后:从第一行开始,尝试在每一列放置一个皇后,然后检查当前放置是否会导致攻击。

    检查当前位置是否安全:确保当前位置所在的列、左对角线和右对角线上没有其他皇后。对于对角线的检查,可以使用规律:在同一左对角线上的元素满足 行号 - 列号 = 常数,在同一右对角线上的元素满足 行号 + 列号 = 常数
  3. 递归的继续与回溯:如果当前位置安全,则放置皇后,并递归地尝试放置下一个皇后。如果放置下一个皇后的所有可能都已尝试且不可行,或者已经放置了所有皇后,则回溯到上一步,移除当前皇后,尝试下一个位置。

  4. 保存解决方案:当成功放置了 n 个皇后,即每一行都成功放置了一个皇后且没有冲突时,将当前棋盘的布局作为一个解决方案保存。

  5. 返回所有解决方案:重复以上步骤,直到遍历完所有可能的布局,返回所有有效的棋盘布局。

完整代码

python
class Solution:def solveNQueens(self, n: int) -> List[List[str]]:def could_place(row, col):return not (cols[col] + hill_diagonals[row - col] + dale_diagonals[row + col])def place_queen(row, col):queens.add((row, col))cols[col] = 1hill_diagonals[row - col] = 1dale_diagonals[row + col] = 1def remove_queen(row, col):queens.remove((row, col))cols[col] = 0hill_diagonals[row - col] = 0dale_diagonals[row + col] = 0def add_solution():solution = []for _, col in sorted(queens):solution.append('.' * col + 'Q' + '.' * (n - col - 1))output.append(solution)def backtrack(row=0):for col in range(n):if could_place(row, col):place_queen(row, col)if row + 1 == n:add_solution()else:backtrack(row + 1)remove_queen(row, col)cols = [0] * nhill_diagonals = [0] * (2 * n - 1)dale_diagonals = [0] * (2 * n - 1)queens = set()output = []backtrack()return output
Java
public class Solution {// 定义记录每一行皇后位置的数组int[] queens;// 定义标记是否可以攻击的辅助数组boolean[] cols;boolean[] diag1;boolean[] diag2;// 存储最终结果的列表List<List<String>> output = new ArrayList<>();public List<List<String>> solveNQueens(int n) {queens = new int[n];cols = new boolean[n];diag1 = new boolean[2 * n - 1];diag2 = new boolean[2 * n - 1];backtrack(0, n);return output;}private void backtrack(int row, int n) {if (row == n) {// 所有皇后都放置完毕,添加到结果列表List<String> board = generateBoard(queens, n);output.add(board);return;}for (int col = 0; col < n; col++) {if (isNotUnderAttack(row, col, n)) {placeQueen(row, col, n);backtrack(row + 1, n);removeQueen(row, col, n);}}}private boolean isNotUnderAttack(int row, int col, int n) {return !cols[col] && !diag1[row - col + n - 1] && !diag2[row + col];}private void placeQueen(int row, int col, int n) {queens[row] = col;cols[col] = true;diag1[row - col + n - 1] = true;diag2[row + col] = true;}private void removeQueen(int row, int col, int n) {queens[row] = 0;cols[col] = false;diag1[row - col + n - 1] = false;diag2[row + col] = false;}private List<String> generateBoard(int[] queens, int n) {List<String> board = new ArrayList<>();for (int i = 0; i < n; i++) {char[] row = new char[n];java.util.Arrays.fill(row, '.');row[queens[i]] = 'Q';board.add(new String(row));}return board;}public static void main(String[] args) {Solution solution = new Solution();List<List<String>> results = solution.solveNQueens(4);for (List<String> board : results) {for (String row : board) {System.out.println(row);}System.out.println();}}
}

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

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

相关文章

接口测试工具:Postman详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman 是一款功能强大的 API 开发和测试工具&#xff0c;以下…

【JDK原理】类加载约束条件

JVM简介 JVM&#xff08;Java虚拟机&#xff09;是Java程序的运行环境&#xff0c;它负责将Java字节码加载到内存中并执行。在JVM中&#xff0c;类加载是一个重要的过程&#xff0c;它负责将类的字节码加载到内存中&#xff0c;并对类进行验证、准备和解析&#xff0c;最终生成…

STM32F411 Micropython使用日记

1、开发板购买&#xff1a;推荐淘宝“无名科技Nologo” 19.8包邮到手&#xff1b;买开发板还需要买SPI NorFlash&#xff0c;推荐8MB的flash&#xff0c;不懂的可以问卖家&#xff0c;买回来需要焊接好&#xff0c;也可以找店家试试看能不能帮忙焊接&#xff0c;不然micropytho…

Java中加减乘除运算工具类

Java 中的 double 类型不能用于精确的加减乘除运算&#xff0c;这是因为计算机使用二进制来表示浮点数&#xff0c;而二进制无法精确表示所有十进制数。 原因&#xff1a; 浮点数由两部分组成&#xff1a;指数和尾数。指数表示浮点数的大小&#xff0c;尾数表示浮点数的精度。…

八节【DBA从入门到实践】课程,带你快速掌握OceanBase运维管理核心技能

为帮助用户及开发者更好、更快地掌握OceanBase DBA核心技能&#xff0c;OceanBase社区设计了配套教程——“DBA从入门到实践”。8期教程带大家循序渐进掌握OceanBase运维管理核心技能。搭配随堂习题和OceanBase技术专家在线答疑&#xff0c;快速掌握重要知识点&#xff0c;并轻…

【DL经典回顾】激活函数大汇总(二十七)(Bent Identity附代码和详细公式)

激活函数大汇总&#xff08;二十七&#xff09;&#xff08;Bent Identity附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可或…

直观与交互:山海鲸可视化软件与Excel传统表格的对比

作为一名长期使用Excel进行数据处理和分析的用户&#xff0c;最近我尝试了一款名为山海鲸的可视化软件&#xff0c;发现它与Excel传统表格之间存在诸多明显的差异。接下来&#xff0c;我将从个人体验视角出发&#xff0c;谈谈这两种工具的不同之处。 首先&#xff0c;从数据呈…

汇编语言和IBM的关系

一 缺乏汇编的硬件没有灵魂 1964年&#xff0c;在IBM没有发明System 360大型计算机之前&#xff0c;IBM已经发明了很多计算机。如IBM 1952年发布的第一台商用计算机&#xff1a;701计算机。1959年&#xff0c;IBM首次利用晶体管、磁芯存储器、印刷电路技术&#xff0c;发明了小…

家谱系统的app的主要功能介绍

家谱系统的app通常具备一系列功能&#xff0c;这些功能旨在帮助用户更好地记录、管理和分享家族的历史和文化。以下是一些常见的家谱系统app的功能介绍&#xff1a; 家谱查看&#xff1a;用户可以通过app登录自己的账号&#xff0c;查看对应的家谱信息。这包括家族成员的基本信…

组件化开发

一、引言 Vue.js 的组件化开发是其核心特性之一&#xff0c;它允许开发者将复杂的界面拆分为可复用的、独立的、小的组件&#xff0c;从而提高开发效率和代码的可维护性。 二、关键点 1.组件的定义 在components下创建.vue文件timecard.vue用来编辑内容。 文件创建完毕后&am…

Linux Shell中的echo命令详解

Linux Shell中的echo命令详解 在Linux Shell中&#xff0c;echo命令是一个常用的内置命令&#xff0c;用于在终端上显示文本或字符串。它主要用于显示变量的值&#xff0c;创建文件的内容&#xff0c;或者简单地输出一些信息。在本文中&#xff0c;我们将详细探讨echo命令的用…

迷宫问题(c++题解)

题目描述 设有一个 N*N(2<N<10)方格的迷宫&#xff0c;入口和出口分别在左上角和右上角。迷宫格子中 分别放 0 和 1&#xff0c;0 表示可通&#xff0c;1 表示不能&#xff0c;入口和出口处肯定是 0。迷宫走的规则如下所示&#xff1a; 即从某点开始&#xff0c;有八个方…

000_【基础篇】SpringBoot概述

介绍 springboot 是 spring 提供的一个子项目&#xff0c;用于快速构建 spring 应用程序 传统的 SSM 框架要导入很多依赖的 jar 包以及配置很多的配置文件&#xff0c;麻烦、繁琐 springboot 特性 springboot 主要&#xff08;还有其他的一些特性&#xff09;有起步依赖和…

精酿啤酒:开启时尚派对的钥匙

Fendi club啤酒&#xff0c;一个代表着时尚与品味的品牌&#xff0c;如今进入了啤酒市场&#xff0c;推出了名为“Fendi club”的啤酒。这一创新的举措不仅展现了品牌的多元化发展&#xff0c;更为消费者提供了一种全新的时尚生活方式。 Fendi club啤酒不仅仅是一种产品&#x…

柠檬酸行业调研:市场预计将继续保持稳健增长

一、市场趋势 柠檬酸作为一种广泛使用的有机酸&#xff0c;其应用领域包括食品饮料、医药、化妆品和工业清洗等。随着消费者对健康饮食的关注增加&#xff0c;以及工业应用的扩展&#xff0c;柠檬酸的需求有望继续增长。 二、主要竞争者 全球柠檬酸市场的主要生产商包括中国的A…

Java修饰符

目录 1.访问修饰符 2.非访问修饰符 3.应用实例 4.继承与访问控制 5.小结 6.代码示例 public修饰符示例 private修饰符示例 protected修饰符示例 static和final修饰符示例 Java修饰符主要分为访问修饰符和非访问修饰符两大类。通过这些修饰符&#xff0c;可以控制类、…

Linux系统编程

文章目录 1. 文件里面存放了5行数据&#xff0c;使用追加模式打开文件&#xff0c;打印前3行&#xff0c;并写入一行&#xff0c;期间使用ftell打印当前位置。2. 修改文件的权限&#xff0c;注意必须使用命令行参数。3. 使用两种方法打印当前目录。4. 传递一个路径名&#xff0…

【C++庖丁解牛】继承的概念及定义 | 继承中的作用域 | 继承与友元继承与静态成员 | 复杂的菱形继承及菱形虚拟继承

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.继承的概念及定义1.1继…

C++ 中this指针归纳

在C中&#xff0c;this指针是一个隐含于每一个非静态成员函数中的特殊指针。它指向调用该成员函数的对象&#xff0c;使得在成员函数中能够访问到当前对象的数据成员和其他成员函数。以下是关于this指针的一些重要信息&#xff1a; 指针类型&#xff1a;this指针是一个指向当前…

【漏洞复现】用友U8Cloud base64 SQL注入漏洞

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚焦成长型、创新型企业&#xff0c;提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud 存在SQL注入漏洞&#xff0c;未授权的攻击者可通过此漏洞获取数据库权限&#xff0c;从而盗取用户数据&a…