Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵

news2024/12/25 12:23:21

目录

52. N皇后 II N Queens II  🌟🌟🌟

53. 最大子数组和  Maximum Subarray  🌟🌟

54. 螺旋矩阵 Spiral Matrix  🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


52. N皇后 II N Queens II

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

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

示例 1:

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

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 9

相关题目: 

51. N 皇后 N-Queens  🌟🌟🌟 

代码1: 回溯法

fn total_n_queens(n: i32) -> i32 {
    let mut res = 0;
    let mut queens = vec![0; n as usize];
    fn backtrack(row: usize, queens: &mut [i32], res: &mut i32) {
        if row == queens.len() {
            *res += 1;
            return;
        }
        for col in 0..queens.len() {
            if is_not_under_attack(queens, row, col) {
                queens[row] = col as i32;
                backtrack(row + 1, queens, res);
                queens[row] = 0;
            }
        }
    }
    backtrack(0, &mut queens, &mut res);
    res
}

fn is_not_under_attack(queens: &[i32], row: usize, col: usize) -> bool {
    for i in 0..row {
        if queens[i] == col as i32 || queens[i] + i as i32 == row as i32 + col as i32
            || queens[i] - i as i32 == col as i32 - row as i32
        {
            return false;
        }
    }
    true
}

fn main() {
    println!("{}", total_n_queens(4));
    println!("{}", total_n_queens(1));
}

代码2: 位运算+dfs

fn total_n_queens(n: i32) -> i32 {
    let mut res = 0;
    fn dfs(row: i32, columns: &mut [bool], diagonals1: &mut [bool], diagonals2: &mut [bool], n: i32, res: &mut i32) {
        if row == n {
            *res += 1;
            return;
        }
        for col in 0..n {
            let index1 = (n - 1) + (col - row);
            let index2 = row + col;
            if !columns[col as usize] && !diagonals1[index1 as usize] && !diagonals2[index2 as usize] {
                columns[col as usize] = true;
                diagonals1[index1 as usize] = true;
                diagonals2[index2 as usize] = true;
                dfs(row + 1, columns, diagonals1, diagonals2, n, res);
                columns[col as usize] = false;
                diagonals1[index1 as usize] = false;
                diagonals2[index2 as usize] = false;
            }
        }
    }
    dfs(0, &mut vec![false; n as usize], &mut vec![false; 2 * n as usize - 1], &mut vec![false; 2 * n as usize - 1], n, &mut res);
    res
}

fn main() {
    println!("{}", total_n_queens(4));
    println!("{}", total_n_queens(1));
}

输出:

2


53. 最大子数组和  Maximum Subarray

给你一个整数数组 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

提示:

  • 1 <= nums.length <= 10^5
  • -10^4 <= nums[i] <= 10^4

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

代码1: 动态规划

fn max_sub_array(nums: &[i32]) -> i32 {
    let n = nums.len();
    let mut dp = vec![0; n];
    dp[0] = nums[0];
    for i in 1..n {
        dp[i] = std::cmp::max(dp[i-1] + nums[i], nums[i]);
    }
    let mut res = dp[0];
    for i in 1..n {
        res = std::cmp::max(res, dp[i]);
    }
    res
}

fn main() {
    let nums = vec![-2, 1, -3, 4, -1, 2, 1, -5, 4];
    println!("{}", max_sub_array(&nums));
    let nums = vec![1];
    println!("{}", max_sub_array(&nums));
    let nums = vec![5,4,-1,7,8];
    println!("{}", max_sub_array(&nums));
}

代码2: 贪心算法

fn max_sub_array(nums: &[i32]) -> i32 {
    let n = nums.len();
    let (mut cur_sum, mut max_sum) = (0, nums[0]);
    for i in 0..n {
        cur_sum += nums[i];
        if cur_sum > max_sum {
            max_sum = cur_sum;
        }
        if cur_sum < 0 {
            cur_sum = 0;
        }
    }
    max_sum
}

fn main() {
    let nums = vec![-2, 1, -3, 4, -1, 2, 1, -5, 4];
    println!("{}", max_sub_array(&nums));
    let nums = vec![1];
    println!("{}", max_sub_array(&nums));
    let nums = vec![5,4,-1,7,8];
    println!("{}", max_sub_array(&nums));
}

输出:

6
1
23


54. 螺旋矩阵 Spiral Matrix

给你一个 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:

fn spiral_order(matrix: &[Vec<i32>]) -> Vec<i32> {
    if matrix.is_empty() {
        return vec![];
    }
    let (m, n) = (matrix.len(), matrix[0].len());
    let mut res = vec![0; m * n];
    let (mut top, mut bottom, mut left, mut right) = (0, m - 1, 0, n - 1);
    let mut idx = 0;
    while top <= bottom && left <= right {
        for i in left..=right {
            res[idx] = matrix[top][i];
            idx += 1;
        }
        for i in top + 1..=bottom {
            res[idx] = matrix[i][right];
            idx += 1;
        }
        if top < bottom && left < right {
            for i in (left..right).rev() {
                res[idx] = matrix[bottom][i];
                idx += 1;
            }
            for i in (top + 1..=bottom - 1).rev() {
                res[idx] = matrix[i][left];
                idx += 1;
            }
        }
        top += 1;
        bottom -= 1;
        left += 1;
        right -= 1;
    }
    res
}

fn main() {
    let matrix = vec![
        vec![1, 2, 3],
        vec![4, 5, 6],
        vec![7, 8, 9],
    ];
    println!("{:?}", spiral_order(&matrix));
    let matrix = vec![
        vec![1, 2, 3, 4],
        vec![5, 6, 7, 8],
        vec![9,10,11,12],
    ];
    println!("{:?}", spiral_order(&matrix));
}

代码2: 递归

fn spiral_order(matrix: Vec<Vec<i32>>) -> Vec<i32> {
    fn spiral_helper(top: usize, bottom: usize, left: usize, right: usize, res: &mut Vec<i32>, idx: &mut usize, matrix: &Vec<Vec<i32>>) {
        if top > bottom || left > right {
            return;
        }
        
        // 从左到右遍历上边界
        for i in left..=right {
            res[*idx] = matrix[top][i];
            *idx += 1;
        }
        
        // 从上到下遍历右边界
        for i in (top + 1)..=bottom {
            res[*idx] = matrix[i][right];
            *idx += 1;
        }
        
        if top < bottom && left < right {
            // 从右到左遍历下边界
            for i in (left..right).rev() {
                res[*idx] = matrix[bottom][i];
                *idx += 1;
            }
            
            // 从下到上遍历左边界
            for i in ((top + 1)..bottom).rev() {
                res[*idx] = matrix[i][left];
                *idx += 1;
            }
        }
        
        // 矩形边界变小,递归调用spiral_helper继续遍历
        spiral_helper(top + 1, bottom - 1, left + 1, right - 1, res, idx, matrix);
        
    }
    
    let m = matrix.len();
    let n = matrix[0].len();
    let mut res = vec![0; m * n]; // 用于记录遍历结果
    let mut idx = 0; // 当前结果数组的下标
    
    // 从矩形最外层开始遍历
    spiral_helper(0, m - 1, 0, n - 1, &mut res, &mut idx, &matrix);
    
    res
}

fn main() {
    let matrix = vec![
        vec![1, 2, 3],
        vec![4, 5, 6],
        vec![7, 8, 9],
    ];
    println!("{:?}", spiral_order(matrix));
    
    let matrix = vec![
        vec![1, 2, 3, 4],
        vec![5, 6, 7, 8],
        vec![9,10,11,12],
    ];
    println!("{:?}", spiral_order(matrix));
}

输出:

[1, 2, 3, 6, 9, 8, 7, 4, 5]
[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7] 


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

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

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

相关文章

chatgpt赋能python:Python关键词匹配:优化你的SEO策略

Python关键词匹配&#xff1a;优化你的SEO策略 在当今数字时代&#xff0c;搜索引擎是许多人获取信息和发现新客户的主要渠道。对于企业或个人网站来说&#xff0c;优化SEO&#xff08;搜索引擎优化&#xff09;策略变得至关重要。在SEO的世界里&#xff0c;关键词匹配是一个重…

springboot+vue编程训练考试测试系统设计与实现

本编程训练系统管理员功能有管理员和用户。管理员功能有个人中心&#xff0c;用户管理&#xff0c;题库资源管理&#xff0c;用户交流&#xff0c;试卷管理&#xff0c;留言板管理&#xff0c;试题管理&#xff0c;系统管理&#xff0c;考试管理。用户可以查看题库资源&#xf…

chatgpt赋能python:使用Python进行人民币兑换-带着您深入了解

使用Python进行人民币兑换 - 带着您深入了解 在当今日益全球化的世界里&#xff0c;进行货币兑换已成为很正常的事情。人民币是世界上最常用的货币之一&#xff0c;而Python作为一种强大的编程语言&#xff0c;可以帮助我们进行人民币兑换计算。本文将介绍如何使用Python进行人…

使用CCProxy搭建windows系统阿里云socket代理服务器 教程

目录 1. 通过windows远程连接阿里云服务器2. 云服务器上安装CCProxy2.1 CCProxy下载安装2.2 设置协议、代理服务、端口号和ip2.3 新建代理用户2.4 确保你的CCProxy启动了服务 3. 在阿里云实例安全组中开放代理端口3.1 前往安全组页面3.2 添加你对应服务的开放端口 总结 欢迎关注…

Java键盘事件处理及监听机制解析

文章目录 概念KeyEventKeyListener代码演示总结 概念 Java事件处理采用了委派事件模型。在这个模型中&#xff0c;当事件发生时&#xff0c;产生事件的对象将事件信息传递给事件的监听者进行处理。在Java中&#xff0c;事件源是产生事件的对象&#xff0c;比如窗口、按钮等&am…

java企业级信息系统开发学习笔记11 利用MyBatis实现条件查询

文章目录 一、学习目标1.对学生表进行条件查询&#xff0c;涉及姓名、性别和年龄三个字段。2.比如查询姓“吴”&#xff0c;性别为“女”&#xff0c;同时年龄为19的学生记录 二、打开上一笔记mybatis项目三、对学生表实现条件查询&#xff08;一&#xff09;创建学生映射器配置…

如何使用wget下载(录制)流媒体或直播推流文件,以及下载出现“正在把输出重定向至 “wget-log.1””错误该怎么办

下载推流文件其实非常简单&#xff0c;就是通常使用的最简单的命令&#xff1a; wget URL -O 输出文件名这里最好设置一下输出文件名&#xff0c;不然很可能下载的文件名称会很奇怪&#xff0c;导致格式识别错误或者其他问题。 不过&#xff0c;如果你直接使用这个命令很可能…

微信小程序nodejs+vue图书馆自习室座位管理系统vax51

系统设计需要从用户和管理员的实际需求开始&#xff0c;以了解他们需要实施哪些功能以及他们可以包括哪些管理工作。 考虑到图书馆座位预约系统小程序系统设计的特点&#xff0c;应满足几个要求&#xff1a;开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#…

[MySQL从入门到精通]MySQL概述及安装

前言 你是否想过我们在登录各种各样的网站时候&#xff0c;所需要输入的账号密码&#xff0c;它们存储在哪里&#xff1f;你猜对了&#xff0c;就是今天我们所要说的数据库 目录 前言 1.数据库的概述 1.1 数据 1.2 数据库 1.3数据库的种类 1.4数据库管理系统 2.MySQL的…

CSS 水平垂直居中的方式

目录 在不知道子元素宽高的情况下&#xff0c;水平垂直居中的六种方式&#xff1a; 1、弹性盒子布局方式来实现&#xff08;flex&#xff09;。 2、绝对定位 transform 3、table标签 4、display&#xff1a;table-cell 5、display: grid 6、writing-mode 属性 在不知道子…

chatgpt赋能python:10年Python编程经验的工程师推荐:免费的PythonIDE

10年Python编程经验的工程师推荐&#xff1a;免费的Python IDE 作为一名有着10年Python编程经验的工程师&#xff0c;我一直在寻找可以帮助我提高效率的Python IDE。在这个过程中&#xff0c;我试用了许多付费和免费的IDE&#xff0c;最终发现了一些免费的Python IDE&#xff…

chatgpt赋能python:Python关闭程序语句:顺畅退出程序的方式

Python关闭程序语句&#xff1a;顺畅退出程序的方式 当我们创建一个Python程序时&#xff0c;我们需要确保该程序以正确的方式结束&#xff0c;而不是通过强制终止或强制关闭窗口这样的极端行为。 这种情况可能会导致数据丢失和资源泄漏&#xff0c;从而影响程序的稳定性和可靠…

chatgpt赋能python:Python在计量中的应用

Python在计量中的应用 Python是一种高级编程语言&#xff0c;已经成为了计量学中不可缺少的工具。 Python有一个强大的生态系统&#xff0c;包括庞大的第三方库&#xff0c;这些库提供了丰富的机器学习、数据可视化和分析工具&#xff0c;这些工具在计量学中发挥了极为重要的作…

【vue2+docx-preview】实现docx文档预览(自定义修改样式)

前言 使用vue预览docx的解决方案&#xff0c;过去还有一种Mammoth 。 它旨在转换 .docx 文档&#xff08;例如由 Microsoft Word 创建的文档&#xff09;&#xff0c;并将其转换为 HTML。 不支持样式。实现方式可以参考&#xff1a;Vue Word预览之mammoth.js 因此选择换成支持…

【thingsboard+NodeRed+chirpstack】实现Lora节点设备的数据上下行通讯

本文主要实现基于 thingsboard+NodeRed+chirpstack 实现 lora设备的数据上下行通讯。 NodeRed作为mqtt桥接器,在开源的社区版 thingsboard上实现 这里写目录标题 LoRa 设备上下行通讯方案数据上行数据下行Device 层面创建设备时,要添加 relation规则链层面灯控模块规则链规则…

【libtorch】pytorch源码编译生成c++ 17 libtorch记录

文章目录 1. 问题描述2. 编译安装前准备3. 编译安装4. 编译好之后使用 1. 问题描述 ubuntu20.04 ros2 humble使用1.8.0 libtorch出现coredump&#xff0c;提示加载模型失败&#xff1a; 原因&#xff1a; ros2 humble项目使用c17编译&#xff0c;c11的libtorch的库文件版本不配…

基于springboot+Vue的汽车商城销售4s店服务系统

基于Vue构建一个汽车服务商城&#xff0c;邀请各大商家入住平台&#xff0c;主要包括邀请洗车店、邀请汽车配件商店、邀请4s店入住、邀请汽车美容店入住、邀请汽车修理店入住平台等。这个平台为了给商家和用户提供便利&#xff0c;用户可以更方便体验汽车服务&#xff0c;商家可…

SpringBoot源码分析:SpringBoot启动源码(一)

一、概述 SpringBoot启动的源码分为前期初始化&#xff0c;和后期启动两个部分&#xff0c;我们从这两个部分开始介绍。 二、前期初始化 SpringBoot前期初始化主要由下面三行代码组成。 进入SpringApplication.getSpringFactoriesInstances方法 最终进入SpringFactoriesLoade…

自学黑客(网络安全)入门小测试

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 最近突然出现好多自学黑客&#xff08;网络安全&#xff09;的文章&#xff0c;粉丝看到后…

chatgpt赋能python:Python关键词统计

Python关键词统计 Python是一种高级编程语言&#xff0c;为开发人员提供了许多功能和库。对于SEO来说&#xff0c;Python具有统计网站上的关键词和分析数据的重要功能。在本文中&#xff0c;我们将探讨Python关键词统计和如何在SEO中使用它。 什么是Python关键词统计 Python…