力扣热门算法题 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,一经查实,立即删除!

相关文章

STM32F411 Micropython使用日记

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

八节【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;从数据呈…

组件化开发

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

000_【基础篇】SpringBoot概述

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

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

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

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

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

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

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

KVM安装-kvm彻底卸载-docker安装Webvirtmgr

KVM安装和使用 一、安装 检测硬件是否支持KVM需要硬件的支持,使用命令查看硬件是否支持KVM。如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的 egrep ‘(vmx|svm)’ /proc/cpuinfo关闭selinux将 /etc/sysconfig/selinux 中的 SELinux=enforcing 修改为 SELinux=d…

AI预测福彩3D第13弹【2024年3月19日预测--第3套算法重新开始计算第2次测试】

今天咱们继续对第3套算法进行第2次测试&#xff0c;第3套算法加入了012路的权重。废话不多说了&#xff0c;直接上结果吧~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月19日福彩3D的七码预测结果如下&#xff1a; 百位&#xff1a;0 1 3 4 2 7 9&#xff08;6换9&#x…

LCR144翻转二叉树(力扣简单题,Java,递归+非递归)

目录 题目描述&#xff1a; 递归代码1&#xff1a; 递归代码2&#xff1a; 非递归代码&#xff08;层次遍历&#xff09;&#xff1a; 题目描述&#xff1a; 给定一棵二叉树的根节点 root&#xff0c;请左右翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a;…

如何在iOS系统抓取log

前言&#xff1a;因为作者目前工作领域和苹果智能家居有关&#xff0c;然后发现一些bug其实是apple sdk原生code的问题&#xff0c;所以需要给apple提radar单&#xff0c;就需要抓ios端Log充当证据给apple看&#xff0c;其实ios抓log非常简单&#xff0c;大家感兴趣可以学习下哦…

VS2022 配置QT5.9.9

QT安装 下载地址&#xff1a;https://download.qt.io/archive/qt/ 下载安装后进行配置 无法运行 rc.exe 下载VS2022 官网下载 配置 1.扩展-管理扩展-下载Qt Visual Studio Tools 安装 2.安装完成后&#xff0c;打开vs2022,点击扩展&#xff0c;会发现多出了QT VS Tools,点…

爱恩斯坦棋小游戏使用C语言+ege/easyx实现

目录 1、游戏介绍和规则 2、需要用到的头文件 3、这里我也配上一个ege和easyx的下载链接吧&#xff0c;应该下一个就可以 4、运行结果部分展示 5、需要用到的图片要放在代码同一文件夹下 6、代码地址&#xff08;里面有需要用到的图片&#xff09; 1、游戏介绍和规则 规则如…

简单介绍注册波兰公司的基本条件

波兰&#xff0c;一个位于中欧的国家&#xff0c;具有丰富的历史文化和资源&#xff0c;同时也拥有稳定的政治和经济环境。在这里&#xff0c;注册公司不仅有助于您拓展业务&#xff0c;还能享受到优惠的税收政策和良好的投资环境。下面&#xff0c;我们将详细介绍注册波兰公司…

Footprint Analytics 强势入局 AI 推出全新投研工具

作者&#xff1a;lesleyfootprint.network 3 月 15 日&#xff0c;链上数据平台 Footprint Analytics 宣布入局 AI&#xff0c;推出了旗下首款 AI 投研工具—— Pea.AI。 作为专门服务于区块链行业的 AI 平台&#xff0c;Pea.AI 旨在提升加密资产投资领域的数据流动性和知识…

镭速,企业传输大文件都在用的udp文件传输工具

在当今快速变化的数字世界中&#xff0c;文件传输工具已成为企业运营不可或缺的一部分。尤其是面对大文件传输的需求&#xff0c;传统的TCP协议由于其设计上的局限性&#xff0c;往往无法满足企业对高速、稳定传输的需求。这时&#xff0c;UDP文件传输工具以其独特的优势走进了…

你知道吗?腾讯云服务器61元一年,2024又降价了

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

自注意力机制的理解

一、自注意力要解决什么问题 循环神经网络由于信息传递的容量以及梯度消失问题&#xff0c;只能建立短距离依赖关系。为了建立长距离的依赖关系&#xff0c;可以增加网络的层数或者使用全连接网络。但是全连接网络无法处理变长的输入序列&#xff0c;另外&#xff0c;不同的输…