Rust每日一练(Leetday0025) 矩阵置零、搜索二维矩阵、颜色分类

news2024/12/29 0:23:40

目录

73. 矩阵置零 Set Matrix Zeroes  🌟🌟

74. 搜索二维矩阵 Search A 2d-Matrix  🌟🌟

75. 颜色分类 Sort Colors  🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


73. 矩阵置零 Set Matrix Zeroes

给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法

示例 1:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

提示:

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -2^31 <= matrix[i][j] <= 2^31 - 1

进阶:

  • 一个直观的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m+n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

代码1:

fn set_zeroes(matrix: &mut Vec<Vec<i32>>) {
    let m = matrix.len();
    let n = matrix[0].len();
    let mut row = vec![false; m];
    let mut col = vec![false; n];
    for i in 0..m {
        for j in 0..n {
            if matrix[i][j] == 0 {
                row[i] = true;
                col[j] = true;
            }
        }
    }
    for i in 0..m {
        for j in 0..n {
            if row[i] || col[j] {
                matrix[i][j] = 0;
            }
        }
    }
}

fn main() {
    let mut matrix = vec![vec![1, 1, 1], vec![1, 0, 1], vec![1, 1, 1]];
    set_zeroes(&mut matrix);
    println!("{:?}", matrix);
    matrix = vec![vec![0, 1, 2, 0], vec![3, 4, 5, 2], vec![1, 3, 1, 5]];
    set_zeroes(&mut matrix);
    println!("{:?}", matrix);
}

输出:

[[1, 0, 1], [0, 0, 0], [1, 0, 1]]
[[0, 0, 0, 0], [0, 4, 5, 0], [0, 3, 1, 0]]

 代码2:

fn set_zeroes(matrix: &mut Vec<Vec<i32>>) {
    let m = matrix.len();
    let n = matrix[0].len();
    let mut row0 = false;
    let mut col0 = false;
    for i in 0..m {
        for j in 0..n {
            if matrix[i][j] == 0 {
                if i == 0 {
                    row0 = true;
                }
                if j == 0 {
                    col0 = true;
                }
                matrix[0][j] = 0;
                matrix[i][0] = 0;
            }
        }
    }
    for i in 1..m {
        for j in 1..n {
            if matrix[i][0] == 0 || matrix[0][j] == 0 {
                matrix[i][j] = 0;
            }
        }
    }
    if row0 {
        for j in 0..n {
            matrix[0][j] = 0;
        }
    }
    if col0 {
        for i in 0..m {
            matrix[i][0] = 0;
        }
    }
}

fn main() {
    let mut matrix = vec![vec![1, 1, 1], vec![1, 0, 1], vec![1, 1, 1]];
    set_zeroes(&mut matrix);
    println!("{:?}", matrix);
    matrix = vec![vec![0, 1, 2, 0], vec![3, 4, 5, 2], vec![1, 3, 1, 5]];
    set_zeroes(&mut matrix);
    println!("{:?}", matrix);
}

74. 搜索二维矩阵 Search A 2d-Matrix

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

示例 1:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

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

代码1:

fn search_matrix(matrix: &Vec<Vec<i32>>, target: i32) -> bool {
    let m = matrix.len();
    let n = matrix[0].len();
    let mut l = 0;
    let mut r = m * n - 1;
    while l <= r {
        let mid = (l + r) >> 1;
        if matrix[mid / n][mid % n] == target {
            return true;
        } else if matrix[mid / n][mid % n] < target {
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    false
}

fn main() {
    let matrix = vec![vec![1, 3, 5, 7], vec![10, 11, 16, 20], vec![23, 30, 34, 60]];
    println!("{}", search_matrix(&matrix, 3));
    println!("{}", search_matrix(&matrix, 13));
}

输出:

true
false

代码2:

fn search_matrix(matrix: &Vec<Vec<i32>>, target: i32) -> bool {
    let m = matrix.len();
    let n = matrix[0].len();
    let (mut l, mut r) = (0, m - 1);
    while l <= r {
        let mid = (l + r) >> 1;
        if matrix[mid][0] == target {
            return true;
        } else if matrix[mid][0] < target {
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    let row = r;
    let (mut l, mut r) = (0, n - 1);
    while l <= r {
        let mid = (l + r) >> 1;
        if matrix[row][mid] == target {
            return true;
        } else if matrix[row][mid] < target {
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    false
}

fn main() {
    let matrix = vec![vec![1, 3, 5, 7], vec![10, 11, 16, 20], vec![23, 30, 34, 60]];
    println!("{}", search_matrix(&matrix, 3));
    println!("{}", search_matrix(&matrix, 13));
}

75. 颜色分类 Sort Colors

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库的sort函数的情况下解决这个问题。

示例 1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2:

输入:nums = [2,0,1]
输出:[0,1,2]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i] 为 01 或 2

进阶:

  • 你可以不使用代码库中的排序函数来解决这道题吗?
  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

 代码1:

fn sort_colors(nums: &mut Vec<i32>) {
    let mut count = vec![0; 3];
    for &num in nums.iter() {
        count[num as usize] += 1;
    }
    let mut index = 0;
    for i in 0..3 {
        for _ in 0..count[i] {
            nums[index] = i as i32;
            index += 1;
        }
    }
}

fn main() {
    let mut nums = vec![2, 0, 2, 1, 1, 0];
    sort_colors(&mut nums);
    println!("{:?}", nums);
    nums = vec![2, 0, 1];
    sort_colors(&mut nums);
    println!("{:?}", nums);
}

代码2:

fn sort_colors(nums: &mut Vec<i32>) {
    let mut index = 0;
    for i in 0..nums.len() {
        if nums[i] == 0 {
            nums.swap(i, index);
            index += 1;
        }
    }
    for i in index..nums.len() {
        if nums[i] == 1 {
            nums.swap(i, index);
            index += 1;
        }
    }
}

fn main() {
    let mut nums = vec![2, 0, 2, 1, 1, 0];
    sort_colors(&mut nums);
    println!("{:?}", nums);
    nums = vec![2, 0, 1];
    sort_colors(&mut nums);
    println!("{:?}", nums);
}

代码3:

fn sort_colors(nums: &mut Vec<i32>) {
    let (mut left, mut right) = (0, nums.len() - 1);
    let mut i = 0;
    while i <= right {
        if nums[i] == 0 {
            nums.swap(i, left);
            left += 1;
            i += 1;
        } else if nums[i] == 2 {
            nums.swap(i, right);
            right -= 1;
        } else {
            i += 1;
        }
    }
}

fn main() {
    let mut nums = vec![2, 0, 2, 1, 1, 0];
    sort_colors(&mut nums);
    println!("{:?}", nums);
    nums = vec![2, 0, 1];
    sort_colors(&mut nums);
    println!("{:?}", nums);
}

输出:

[0, 0, 1, 1, 2, 2]
[0, 1, 2]


🌟 每日一练刷题专栏 🌟

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

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

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

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

 主页: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/636371.html

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

相关文章

逻辑回归与决策树回归

逻辑回归 逻辑回归函数: 逻辑回归分析属于概率型回归分析方法。 假设在自变量xi1、xi2…xip的作用下&#xff0c;因变量y取值为1和0的二值变量&#xff0c;其取值为1的概率为pi&#xff0c;则可以表示为&#xff1a; 相反&#xff0c;y取值为0的概率即&#xff1a; 对y取值为…

FlinkSql 使用总结

一、FlinkSQL底层实现理解 FlinkSQL在flink Framework的位置 Flink Table & SQL API是在DataStream和DataSet之上封装的一层高级API。由于DataStream和DataSet有各自的API&#xff0c;开发起来又有些困难&#xff0c;如果只是应对一些相对通用的需求会有点麻烦。而Flink T…

【AUTOSAR】UDS协议的代码分析与解读(一)----测试UDS协议DID的填写与读取

测试环境配置 Environment-1: Trace32配置&#xff08;内核选择&#xff09; Environment-2: Dgs上位机配置&#xff08;报文发送&#xff09; AV012 Dgs密码 &#xff1a;hsae_dgs 配置请求ID和响应ID可以去代码中查看&#xff0c;备注型号和设备类别&#xff0c;选择售后烧…

一款集成了多种老牌工具字典的轻量级目录扫描器

功能 dirxk&#xff0c;一款集成了多种老牌工具字典的轻量级目录扫描器&#xff0c;包括御剑后台扫描字典&#xff0c;test404网站备份&#xff0c;web破壳扫描器&#xff0c;御剑1.5扫描字典&#xff0c;御剑专业版字典&#xff0c;wwwscan字典&#xff0c;dirscan字典&#…

ceph块存储使用总结

ceph块存储使用总结 大纲 ceph osd pool池创建 & 更新osd pool关联应用删除ceph osd pool使用ceph块存储自动挂载扩容 本次测试相关环境与软件&#xff1a; ceph15.2.17 Octopuseph-deploy 2.0.1ubuntu18.04.6 ceph osd pool池 基础概念 Ceph 将数据存储在存储池中。…

Hive存储格式

hive的存储格式 hive的存储格式分为两大类&#xff1a;一类纯文本文件&#xff0c;一类是二进制文件存储。 第一类&#xff1a; 纯文本文件存储 textfile: 纯文本文件存储格式&#xff0c;不压缩&#xff0c;也是hive的默认存储格式&#xff0c;磁盘开销大&#xff0c;数据解…

3. 说说Java“锁“事

3.1 从轻松的乐观锁和悲观锁开讲 ● 悲观锁&#xff1a; 认为自己在使用数据的时候一定有别的线程来修改数据&#xff0c;因此在获取数据的时候会先加锁&#xff0c;确保数据不会被别的线程修改&#xff0c;synchronized和Lock的实现类都是悲观锁&#xff0c;适合写操作多的场…

WhaleHiking的“三山五岳”第一站:泰山

Datawhale团队 来源&#xff1a;whaleHiking 开场白 大家应该都听说过杜甫的《望岳》——“会当凌绝顶&#xff0c;一览众山小。”&#xff0c;每次看见这句诗的时候&#xff0c;总想去泰山看一看&#xff0c;感受诗中的壮美山河景色&#xff01; 机不可失时不再来&#xff0c…

JVM图解

JVM图解 一、JVM的运行时数据区 概览JVM运行时数据区主要包括以下几个部分&#xff1a;程序计数器、虚拟机栈、本地方法栈、方法区、堆&#xff1b;其中 栈是运行时的单位&#xff0c;而堆是存储的单位&#xff01; 1.程序计数器 程序计数器可以看作是当前线程所执行的字节码…

调用阿里API实现银行卡实名认证

调用阿里API实现银行卡实名认证 1&#xff0e;作者介绍2&#xff0e;算法介绍2.1 阿里云技术介绍2.2 API介绍 3&#xff0e;实验代码3.1 调用阿里云API流程3.2 代码实现3.2.1完整代码3.2.2实验结果 4&#xff0e;报错分析5&#xff0e;参考链接 1&#xff0e;作者介绍 薛维哥&…

针对潜在客户CRM如何进行管理?

CRM客户管理系统可以帮助企业管理客户&#xff0c;提高客户转化率&#xff0c;增加企业收入和利润。那么&#xff0c;在CRM中如何进行潜在客户管理呢&#xff1f;本文将从以下几个方面来为您解答。 一、什么是潜在客户&#xff1f; 潜在客户是指对企业的产品或服务有意向&…

驱动开发:内核遍历文件或目录

在笔者前一篇文章《驱动开发&#xff1a;内核文件读写系列函数》简单的介绍了内核中如何对文件进行基本的读写操作&#xff0c;本章我们将实现内核下遍历文件或目录这一功能&#xff0c;该功能的实现需要依赖于ZwQueryDirectoryFile这个内核API函数来实现&#xff0c;该函数可返…

docker的资源控制

一、CPU控制 cgroups&#xff0c;是一个非常强大的linux内核工具&#xff0c;他不仅可以限制被namespace隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。 cgroups有四大功能: 资源限制:可以…

报表生成器FastReport .Net用户指南:“Picture“对象

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

【30天熟悉Go语言】6 Go 复杂数据类型之指针

文章目录 一、前言二、数据类型总览三、指针1、特殊运算符& *2、内存角度来看指针3、使用指针修改数据4、指针使用的注意事项5、对比着看Java的引用类型 三、总结 一、前言 Go系列文章&#xff1a; GO开篇&#xff1a;手握Java走进Golang的世界2 Go开发环境搭建、Hello Wor…

Zstack实习-基础知识总结归纳-待更新

什么是虚拟化&#xff1f; 虚拟化技术是一种将物理计算资源&#xff0c;如服务器、存储和网络等&#xff0c;转化成虚拟的逻辑资源的技术。通过虚拟化技术&#xff0c;可以将多个独立的操作系统运行在同一台物理计算机上&#xff0c;实现资源的共享&#xff0c;提高硬件的利用率…

C++那些事之项目篇Catch2

C那些事之项目篇Catch2 今天推荐一个值得学习的开源项目"Catch2" &#xff0c;之前写过如何使用google的googletest编写单元测试&#xff0c;你会发现需要编译生成lib库&#xff0c;比较麻烦&#xff0c;而Catch2是一个Header only库&#xff0c;能够快速使用&#x…

Python3数据分析与挖掘建模(13)复合分析-因子关分析与小结

1.因子分析 1.1 探索性因子分析 探索性因子分析&#xff08;Exploratory Factor Analysis&#xff0c;EFA&#xff09;是一种统计方法&#xff0c;用于分析观测变量之间的潜在结构和关联性。它旨在确定多个观测变量是否可以归结为较少数量的潜在因子&#xff0c;从而帮助简化…

机器学习笔记 - 多实例学习(MIL)弱监督学习

一、多实例学习概述 多实例学习(MIL)是一种弱监督学习形式,其中训练实例被排列在称为袋的集合中,并为整个袋提供标签。这种方式越来越受到人们的关注,因为它自然适合各种问题,并允许利用弱标记数据。因此,它被应用于计算机视觉和文档分类等不同的应用领域。 多实例学习(…

【国产虚拟仪器】基于 ZYNQ的声发射采集系统方案

系 统 的 整 体 设 计 流 程 为 根 据 上 述 设 计 需 求 进 行 硬 件 设 备 的 选 型 并 搭 建 起 声 发 射 采 集 系 统 的 硬 件 平 台 &#xff0c; 在 该平 台 上 进行 声 发 射 采 集 板 卡 的 设 计 并 根 据 要求进行 上 位 机…