力扣热门算法题 52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵

52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.20 可通过leetcode所有测试用例。

目录

52. N 皇后 II

解题思路

完整代码

Python

Java

53. 最大子数组和

解题思路

完整代码

Python

Java

54. 螺旋矩阵

解题思路

完整代码

Python

Java


52. N 皇后 II

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

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

示例 1:

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

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 9

解题思路

        可以使用回溯法,类似于解决 n 皇后问题摆放方案的方法,但这次我们只需要计算不同解决方案的数量。关键点在于合理地放置皇后,以避免她们相互攻击。

  1. 初始化数据结构:使用数组或其他数据结构来标记哪些列、对角线(左上到右下和右上到左下)已经被占用。

  2. 递归回溯:从第一行开始,尝试在每一列放置皇后。对于放置在 (row, col) 的皇后,需要标记第 col 列、(row + col) 的左上到右下对角线和 (row - col) 的右上到左下对角线为占用状态。

  3. 检查冲突:在尝试放置每个皇后之前,检查当前列和两个对角线是否已经被其他皇后占用。

  4. 统计解决方案数量:每当成功放置了 n 个皇后(即达到了最后一行的下一行),就将解决方案数量加一。

  5. 回溯:尝试当前行的下一列或回到上一行,撤销当前放置的皇后,并尝试新的位置。

完整代码

Python
class Solution:
    def totalNQueens(self, n: int) -> int:
        def backtrack(row = 0, hills = 0, next_row = 0, dales = 0, count = 0):
            if row == n:  # 如果已经放置了 n 个皇后
                count += 1  # 解决方案数量加一
            else:
                # 在所有可用的列中
                free_columns = columns & ~(hills | next_row | dales)
                while free_columns:
                    # 选择最右侧的可用列
                    curr_column = - free_columns & free_columns
                    # 放置皇后并去掉当前列
                    free_columns ^= curr_column
                    count = backtrack(row + 1, 
                                    (hills | curr_column) << 1, 
                                    next_row | curr_column, 
                                    (dales | curr_column) >> 1, 
                                    count)
            return count

        # 初始化可用列
        columns = (1 << n) - 1
        return backtrack()
Java
public class Solution {
    private int size;
    private int count;

    private void solve(int row, int ld, int rd) {
        if (row == size) {
            count++;
            return;
        }
        int pos = size & ~(row | ld | rd);
        while (pos != 0) {
            int p = pos & -pos;
            pos -= p;  // 放置皇后并移除当前位置
            solve(row | p, (ld | p) << 1, (rd | p) >> 1);
        }
    }

    public int totalNQueens(int n) {
        count = 0;
        size = (1 << n) - 1;
        solve(0, 0, 0);
        return count;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int n = 4;
        System.out.println(solution.totalNQueens(n));
    }
}

53. 最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组

是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

解题思路

        我们可以使用一个称为“Kadane算法”的高效方法。Kadane算法通过一次遍历数组来找到最大的连续子数组和。该算法的基本思想是维护一个局部最大和一个全局最大变量,随着数组的遍历,更新这两个变量。

  1. 初始化两个变量currentMax 用于追踪当前位置的最大子数组和,globalMax 用于记录迄今为止找到的最大子数组和。初始时,两个变量都设置为数组的第一个元素。

  2. 遍历数组:从数组的第二个元素开始遍历。

  3. 更新 currentMax:对于每个元素,更新 currentMax 为当前元素本身和当前元素加上之前的 currentMax 之间的较大者。这一步骤确保了 currentMax 总是维护着到当前位置为止的最大子数组和。

    currentMax = max(nums[i], currentMax + nums[i])

  4. 更新 globalMax:如果更新后的 currentMax 大于 globalMax,则更新 globalMaxcurrentMax 的值。这确保了 globalMax 总是全局最大子数组和。

    globalMax = max(globalMax, currentMax)

  5. 返回结果:遍历完成后,globalMax 将包含整个数组的最大子数组和。

完整代码

Python
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        currentMax = globalMax = nums[0]
        for num in nums[1:]:
            currentMax = max(num, currentMax + num)
            globalMax = max(globalMax, currentMax)
        return globalMax
Java
public class Solution {
    public int maxSubArray(int[] nums) {
        int currentMax = nums[0];
        int globalMax = nums[0];
        
        for (int i = 1; i < nums.length; i++) {
            currentMax = Math.max(nums[i], currentMax + nums[i]);
            globalMax = Math.max(globalMax, currentMax);
        }
        
        return globalMax;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
        System.out.println(solution.maxSubArray(nums));
    }
}

54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

解题思路

        要按顺时针螺旋顺序返回矩阵中的所有元素,我们可以模拟整个过程,遵循从左到右、从上到下、从右到左、从下到上的顺序,每完成一圈后,缩小遍历的范围。

  1. 初始化四个方向的边界topbottomleftright 分别代表了上下左右四个方向的边界。初始化时,top = 0bottom = m-1left = 0right = n-1

  2. 按顺序遍历矩阵:按照顺时针方向遍历矩阵的外围,然后逐层向内缩小范围,直到遍历完所有元素。具体步骤如下:

    a. 从左到右遍历上层元素(top 行),遍历完成后 top++

    b. 从上到下遍历右侧元素(right 列),遍历完成后 right--

    c. 如果 top <= bottom,从右到左遍历底层元素(bottom 行),遍历完成后 bottom--

    d. 如果 left <= right,从下到上遍历左侧元素(left 列),遍历完成后 left++

  3. 收集元素:在每个方向上遍历时,将遍历到的元素添加到结果列表中。

  4. 返回结果:当上述遍历完成后,结果列表中将包含按顺时针螺旋顺序的所有矩阵元素。

完整代码

Python
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        result = []
        if not matrix:
            return result

        top, bottom, left, right = 0, len(matrix) - 1, 0, len(matrix[0]) - 1

        while left <= right and top <= bottom:
            # 从左到右
            for i in range(left, right + 1):
                result.append(matrix[top][i])
            top += 1

            # 从上到下
            for i in range(top, bottom + 1):
                result.append(matrix[i][right])
            right -= 1

            # 从右到左
            if top <= bottom:
                for i in range(right, left - 1, -1):
                    result.append(matrix[bottom][i])
                bottom -= 1

            # 从下到上
            if left <= right:
                for i in range(bottom, top - 1, -1):
                    result.append(matrix[i][left])
                left += 1

        return result
Java
public class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new ArrayList<>();
        if (matrix == null || matrix.length == 0) return result;

        int top = 0, bottom = matrix.length - 1, left = 0, right = matrix[0].length - 1;

        while (left <= right && top <= bottom) {
            // 从左到右
            for (int i = left; i <= right; i++) {
                result.add(matrix[top][i]);
            }
            top++;

            // 从上到下
            for (int i = top; i <= bottom; i++) {
                result.add(matrix[i][right]);
            }
            right--;

            // 从右到左
            if (top <= bottom) {
                for (int i = right; i >= left; i--) {
                    result.add(matrix[bottom][i]);
                }
                bottom--;
            }

            // 从下到上
            if (left <= right) {
                for (int i = bottom; i >= top; i--) {
                    result.add(matrix[i][left]);
                }
                left++;
            }
        }

        return result;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        System.out.println(solution.spiralOrder(matrix));
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TS + Vue3 elementUI 表格列表中如何方便的标识不同类型的内容,颜色区分 enum

TS Vue3 elementUI 表格列表中如何方便的标识不同类型的内容&#xff0c;颜色区分 enum 本文内容为 TypeScript 一、基础知识 在展示列表的时候&#xff0c;列表中的某个数据可能是一个类别&#xff0c;比如&#xff1a; enum EnumOrderStatus{"未受理" 1,"…

MySQL Workbench连接云服务器内网数据库

在项目上遇到一个问题&#xff0c;生产环境是Centos&#xff0c;分配了两台云服务器&#xff0c;一台应用服务&#xff0c;一台数据库服务&#xff0c;应用服务与数据库服务采用内网连接。我作为开发和运维方&#xff0c;有权限直接访问应用服务&#xff0c;但是数据库服务器需…

C++知识点总览

1.输入输出流 在C中要想输入和输出 我们会经常用到 #include <stdio.h>在C中头文件的命名风格不用.h #include <iostream>using namespace std;为什么要用上面俩句话的解释&#xff08;自己写的博客&#xff09; c中 为什么要写&#xff1c;iostream&#xff1e;…

苹果计划与谷歌合作使用Gemini AI技术,提升iPhone功能,同时探索与OpenAI合作可能性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

面试算法-73-二叉树的最小深度

题目 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2 解 class Solu…

人工智能时代的引领者:AI提示工程激发大语言模型的无限潜能

文章目录 一、AI提示工程的概念与定义二、AI提示工程的应用领域三、AI提示工程的技术创新与突破四、AI提示工程的未来发展趋势《AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型》亮点内容简介作者简介目录 一、AI提示工程的概念与定义 在当今日新月异的科…

智能新纪元:AI大模型的奥秘与未来

目录 AI大模型学习 数学基础和编程能力 特定领域的业务理解 模型结构和算法的优化 为人类生活和工作带来的便利 AI大模型背后的技术原理 AI大模型学习的理论基础 1. 统计学习理论 2. 优化理论 3. 神经网络和深度学习 4. 表示学习 5. 迁移学习和微调 6. 机器学习的…

[数据集][目标检测]高质量铁路轨道缺陷检测数据集VOC+YOLO格式1050张6类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1050 标注数量(xml文件个数)&#xff1a;1050 标注数量(txt文件个数)&#xff1a;1050 标注…

Spring Web MVC入门(6)

应用分层 在开发的过程中, 我们会发现, 程序的代码有时会很"杂乱", 如果后面的项目更大了, 那就会更加地杂乱无章(文件乱, 代码内容乱). 也基于此, 接下来让我们来学习一下应用分层. 也类似于公司的组织架构 公司初创阶段, 一个人身兼数职, 既做财务, 又做人事,还有…

【C++】stringstream类 最全超详细解析(什么是stringstream? stringstrem有哪些作用? 如何在算法中应用?)

目录 一、前言 二、stringstream 是什么 &#xff1f; 三、stringstream 的用法 ✨构造函数 ✨输出字符串 ✨两种构造函数带来的不同 ✨修改、清空 stringstream 内容 四、stringsteam 的用途 ✨ 利用 stringstream 去除字符串空格 ✨ 利用 stringstream 指定字符分割字符…

【RPG Maker MV 仿新仙剑 战斗场景UI (六)】

RPG Maker MV 仿新仙剑 战斗场景UI 六 法术战斗窗口代码仿新仙剑效果 法术战斗窗口 这次来水点内容 由于之前已经做过了仿新仙剑的法术及物品窗口因此本次两篇内容&#xff0c;就来水点内容&#xff01;&#xff01;&#xff01; 由于帮助窗口之前已经做过&#xff0c;因此直接…

课程思政元素收集遴选系统|基于JSP技术+ Mysql+Java+ B/S结构的课程思政元素收集遴选系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

CVPR 2024 | 长时舞蹈生成:数秒钟可生成极长的3D舞蹈

论文题目&#xff1a; Transparent Image Layer Diffusion using Latent Transparency 论文链接&#xff1a; https://arxiv.org/abs/2402.17113 代码仓库&#xff1a; GitHub - layerdiffusion/LayerDiffuse: Transparent Image Layer Diffusion using Latent Transparency 目…

PR无法在指定轨道上粘贴

在Adobe Premier Pro 2022中&#xff0c;按照视频教程复制(Ctrl C)、粘贴(Ctrl V)一段视频素材时&#xff0c;不能粘贴到点亮的轨道上&#xff0c;尝试了几次都不行。 最后找到了原因。 在快捷键设置中&#xff0c;发现CtrlV快捷键对应的是&#xff0c;粘贴到同一轨道&…

在线教育资源管理系统|基于JSP技术+ Mysql+Java的在线教育资源管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

一文了解AI长文本工具:Kimi Chat;与ChatGPT比较对比

一文了解AI长文本工具&#xff1a;Kimi Chat&#xff1b;与ChatGPT比较对比 在人工智能领域&#xff0c;ChatGPT、Claude2.1和Kimi Chat都是备受关注的大型模型。它们在文本生成、理解和处理方面展现了强大的能力。本文将深入探讨这三个工具的核心功能、优劣势以及适用场景&am…

人工智能驱动的对话背后的魔力

未来交流革命&#xff1a;了解对话式AI的关键优势 在不断发展的技术世界中&#xff0c;人工智能驱动的对话处于创新的前沿&#xff0c;改变了企业与客户互动和管理关系的方式。 这篇博文深入探讨了对话式人工智能的迷人世界&#xff0c;探讨了其当前的趋势、应用程序以及它在重…

聚焦“新质职校“发展,企业力量赋新能

聚焦"新质职校"发展 一、什么是“新质生产力” 新质生产力自2023年9月被首次提出后&#xff0c;便成为经济热词。在最近的全国“两会”中&#xff0c;新质生产力这一议题引起了广泛关注。新质生产力&#xff0c;作为对传统生产力概念的全面升级&#xff0c;是对当前…

《数字集成电路物理设计》学习笔记(持续更新中)

参考书籍&#xff1a; 《数字集成电路物理设计》pdf下载百度云链接&#xff1a; 链接: https://pan.baidu.com/s/1jOD54q_f9KLhfX6InabTRA?pwd8888 提取码: 8888 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v8的分享 目录 第1章 集…

STM32关于使用定时器触发ADC转换的理解

以STM32 ADC的常规通道为例&#xff08;注入通道类似&#xff09;&#xff1a; 如上图&#xff0c;STM32 ADC的常规通道可以由以上6个信号触发任何一个&#xff0c;我们以使用TIM2_CH2触发ADC1&#xff0c;独立模式&#xff0c;每次仅测一条通道&#xff0c;则ADC的配置如下&am…