Rust每日一练(Leetday0016) 全排列I\II、旋转图像

目录

46. 全排列 Permutations  🌟🌟

47. 全排列 II Permutations II  🌟🌟

48. 旋转图像 Rotate Image  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


46. 全排列 Permutations

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

代码: 回溯法

fn permute(nums: Vec<i32>) -> Vec<Vec<i32>> {let mut res: Vec<Vec<i32>> = Vec::new();if nums.len() == 0 {return res;}let mut used: Vec<bool> = vec![false; nums.len()];fn backtrack(path: &mut Vec<i32>, res: &mut Vec<Vec<i32>>, nums: &Vec<i32>, used: &mut Vec<bool>) {if path.len() == nums.len() {let tmp = path.clone();res.push(tmp);return;}for i in 0..nums.len() {if !used[i] {used[i] = true;path.push(nums[i]);backtrack(path, res, nums, used);path.pop();used[i] = false;}}}backtrack(&mut Vec::new(), &mut res, &nums, &mut used);return res;
}fn main() {println!("{:?}", permute(vec![1, 2, 3]));println!("{:?}", permute(vec![0, 1]));println!("{:?}", permute(vec![1]));
}

输出:

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

代码2: 字典序法

fn permute(nums: &mut [i32]) -> Vec<Vec<i32>> {let mut res = vec![];if nums.len() == 1 {res.push(nums.to_vec());return res;}nums.sort();loop {let tmp = nums.to_vec();res.push(tmp);let (mut i, mut j) = (nums.len() - 2, nums.len() - 1);while i > 0 && nums[i] >= nums[i + 1] {i -= 1;}if i == 0 && nums[i] >= nums[i + 1] {break;}while nums[j] <= nums[i] {j -= 1;}nums.swap(i, j);nums[i + 1..].reverse();}res
}fn main() {let mut nums = [1, 2, 3];println!("{:?}", permute(&mut nums));let mut nums = [0, 1];println!("{:?}", permute(&mut nums));let mut nums = [1];println!("{:?}", permute(&mut nums));
}

代码3: DFS

fn permute(nums: Vec<i32>) -> Vec<Vec<i32>> {fn dfs(nums: &Vec<i32>, index: usize, p: &mut Vec<i32>, res: &mut Vec<Vec<i32>>, used: &mut Vec<bool>) {if index == nums.len() {let temp = p.clone();res.push(temp);return;}for i in 0..nums.len() {if !used[i] {used[i] = true;p.push(nums[i]);dfs(nums, index + 1, p, res, used);p.pop();used[i] = false;}}}if nums.len() == 0 {return vec![];}let mut used: Vec<bool> = vec![false; nums.len()];let mut p: Vec<i32> = vec![];let mut res: Vec<Vec<i32>> = vec![];dfs(&nums, 0, &mut p, &mut res, &mut used);return res;
}fn main() {println!("{:?}", permute(vec![1, 2, 3]));println!("{:?}", permute(vec![0, 1]));println!("{:?}", permute(vec![1]));
}

47. 全排列 II Permutations II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

代码1:  回溯法

fn permute_unique(nums: Vec<i32>) -> Vec<Vec<i32>> {fn backtrack(path: &mut Vec<i32>, res: &mut Vec<Vec<i32>>, nums: &Vec<i32>, used: &mut Vec<bool>) {if path.len() == nums.len() {let tmp = path.clone();res.push(tmp);return;}for i in 0..nums.len() {if used[i] || (i > 0 && !used[i - 1] && nums[i] == nums[i - 1]) {continue;}used[i] = true;path.push(nums[i]);backtrack(path, res, nums, used);path.pop();used[i] = false;}}let mut nums_copy = nums.clone();nums_copy.sort();let mut used: Vec<bool> = vec![false; nums.len()];let mut path: Vec<i32> = vec![];let mut res: Vec<Vec<i32>> = vec![];backtrack(&mut path, &mut res, &nums_copy, &mut used);return res;
}
fn main() {println!("{:?}", permute_unique(vec![1, 1, 2]));println!("{:?}", permute_unique(vec![1, 2, 3]));
}

输出:

[[1, 1, 2], [1, 2, 1], [2, 1, 1]]
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

代码2:  字典序法

fn permute_unique(nums: &mut [i32]) -> Vec<Vec<i32>> {let mut res = vec![];if nums.is_empty() {return res;}nums.sort();let len = nums.len();let (mut i, mut j) = (len - 2, len - 1);loop {let tmp = nums.to_vec();res.push(tmp);while i > 0 && nums[i] >= nums[i + 1] {i -= 1;}if i == 0 && nums[i] >= nums[i + 1] {break;}while j > 0 && nums[j] <= nums[i] {j -= 1;}if nums[j] == nums[i] && j > i + 1 {continue;}nums.swap(i, j);nums[i + 1..].reverse();if i == 0 && j == 1 {break;}i = len - 2;j = len - 1;}res
}fn main() {let mut nums = [1, 1, 2];println!("{:?}", permute_unique(&mut nums));let mut nums = [1, 2, 3];println!("{:?}", permute_unique(&mut nums));
}

 代码3:  DFS

fn permute_unique(nums: &mut [i32]) -> Vec<Vec<i32>> {let mut res = vec![];if nums.is_empty() {return res;}let mut used = vec![false; nums.len()];let mut p = vec![];nums.sort();dfs(nums, 0, &mut p, &mut res, &mut used);res
}fn dfs(nums: &[i32], index: usize, p: &mut Vec<i32>, res: &mut Vec<Vec<i32>>, used: &mut [bool]) {if index == nums.len() {res.push(p.clone());return;}for i in 0..nums.len() {if !used[i] {if i > 0 && nums[i] == nums[i - 1] && !used[i - 1] {continue;}used[i] = true;p.push(nums[i]);dfs(nums, index + 1, p, res, used);p.pop();used[i] = false;}}
}fn main() {let mut nums = [1, 1, 2];println!("{:?}", permute_unique(&mut nums));let mut nums = [1, 2, 3];println!("{:?}", permute_unique(&mut nums));
}
fn permute_unique(nums: Vec<i32>) -> Vec<Vec<i32>> {fn dfs(nums: &[i32], index: usize, p: &mut Vec<i32>, res: &mut Vec<Vec<i32>>, used: &mut [bool]) {if index == nums.len() {res.push(p.clone());return;}for i in 0..nums.len() {if !used[i] {if i > 0 && nums[i] == nums[i - 1] && !used[i - 1] {continue;}used[i] = true;p.push(nums[i]);dfs(nums, index + 1, p, res, used);p.pop();used[i] = false;}}}if nums.is_empty() {return vec![];}let mut nums_copy = nums.clone();nums_copy.sort();let mut res: Vec<Vec<i32>> = vec![];let mut used = vec![false; nums.len()];dfs(&nums_copy, 0, &mut vec![], &mut res, &mut used);res
}fn main() {println!("{:?}", permute_unique(vec![1, 1, 2]));println!("{:?}", permute_unique(vec![1, 2, 3]));
}

48. 旋转图像 Rotate Image

给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在
 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

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

示例 2:

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

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

代码1: 转置加翻转

先转置矩阵,然后翻转每一行即可得到顺时针旋转 90 度后的矩阵。

fn rotate(matrix: &mut Vec<Vec<i32>>) {let n = matrix.len();// 转置矩阵for i in 0..n {for j in i..n {let temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}// 翻转每一行for i in 0..n {for j in 0..n / 2 {let temp = matrix[i][j];matrix[i][j] = matrix[i][n - j - 1];matrix[i][n - j - 1] = temp;}}
}fn main() {let mut matrix = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];rotate(&mut matrix);println!("{:?}", matrix);let mut matrix = vec![vec![5, 1, 9, 11], vec![2, 4, 8, 10], vec![13, 3, 6, 7], vec![15, 14, 12, 16]];rotate(&mut matrix);println!("{:?}", matrix);
}

输出:

[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
[[15, 13, 2, 5], [14, 3, 4, 1], [12, 6, 8, 9], [16, 7, 10, 11]]

代码2: 分块翻转

将矩阵分成四个部分,并将每个部分按顺时针旋转 90 度。

fn rotate(matrix: &mut Vec<Vec<i32>>) {let n = matrix.len();// 转置矩阵for i in 0..n {for j in i..n {let temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}// 翻转每一行for i in 0..n {for j in 0..n / 2 {let temp = matrix[i][j];matrix[i][j] = matrix[i][n - j - 1];matrix[i][n - j - 1] = temp;}}
}fn main() {let mut matrix = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];rotate(&mut matrix);println!("{:?}", matrix);let mut matrix = vec![vec![5, 1, 9, 11], vec![2, 4, 8, 10], vec![13, 3, 6, 7], vec![15, 14, 12, 16]];rotate(&mut matrix);println!("{:?}", matrix);
}

代码3: 对角线变换+水平翻转

将矩阵分成四个部分,并将每个部分按顺时针旋转 90 度。

fn rotate(matrix: &mut Vec<Vec<i32>>) {let row = matrix.len();if row <= 0 {return;}let column = matrix[0].len();// 对角线变换for i in 0..row {for j in i + 1..column {let temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}// 竖直轴对称翻转let half_column = column / 2;for i in 0..row {for j in 0..half_column {let temp = matrix[i][j];matrix[i][j] = matrix[i][column - j - 1];matrix[i][column - j - 1] = temp;}}
}fn main() {let mut matrix = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];rotate(&mut matrix);println!("{:?}", matrix);let mut matrix = vec![vec![5, 1, 9, 11], vec![2, 4, 8, 10], vec![13, 3, 6, 7], vec![15, 14, 12, 16]];rotate(&mut matrix);println!("{:?}", matrix);
}

翻转+旋转原理C代码 

/*
* clockwise rotate 顺时针旋转
* first reverse up to down, then swap the symmetry
* 1 2 3      7 8 9      7 4 1
* 4 5 6 => 4 5 6 => 8 5 2
* 7 8 9      1 2 3      9 6 3
*/
void rotate(vector<vector<int> > &matrix) {
    reverse(matrix.begin(), matrix.end());
    for (int i = 0; i < matrix.size(); ++i) {
        for (int j = i + 1; j < matrix[i].size(); ++j)
            swap(matrix[i][j], matrix[j][i]);
    }
}
/*
* anticlockwise rotate 逆时针旋转
* first reverse left to right, then swap the symmetry
* 1 2 3      3 2 1      3 6 9
* 4 5 6 => 6 5 4 => 2 5 8
* 7 8 9      9 8 7      1 4 7
*/
void anti_rotate(vector<vector<int> > &matrix) {
    for (auto vi : matrix) reverse(vi.begin(), vi.end());
        for (int i = 0; i < matrix.size(); ++i) {
            for (int j = i + 1; j < matrix[i].size(); ++j)
                swap(matrix[i][j], matrix[j][i]);
        }
}


🌟 每日一练刷题专栏 🌟

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

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

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

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

 主页: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://xiahunao.cn/news/256284.html

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

相关文章

win10操作系统官网如何下载ios境像文件安装操作系统

1.打开官网 2.立即下载工具 3.正在准备进行工作 4.接收条款 5.根据需求选择安装合适的位置 6.等待创建成功 7.右键选择装载 8.双击安装setup.exe文件 8 使用微Pe安装过程中发现需要联网更新解决 winR 然后cmd 输入 OOBE\BYPASSNRO 9 或者关闭此进程 电脑不要插网线&#xff…

虚拟机系统iso镜像下载_如何下载正版系统镜像

许多网友想装系统&#xff0c;可是不会装(后期会推装系统的文章)&#xff0c;而且网上的系统有的装有全家桶&#xff0c;有的又有捆绑软件&#xff0c;严重的还有病毒。那么&#xff0c;在哪里去下载正版&#xff0c;安全的系统镜像呢 "MSDN&#xff0c;我告诉你"这个…

自定义IOS系统弹框

写在之前 系统的弹框虽然很好看&#xff0c;但是有时候无法完全满足UI设计的需求&#xff0c;比如说中间要显示一个输入框&#xff0c;或者要放置一张图片&#xff0c;这里介绍一个很早之前的自定义弹框库&#xff0c;这个自定义弹框sdk写的很细致&#xff0c;定制性很强&…

华为vivo小米魅族oppo荣耀安卓手机刷IOS苹果系统

现在的刷机教程层出不穷&#xff0c;但是没有哪个大神可以开发出一款安卓刷IOS的工具&#xff0c;使得安卓手机或者安卓平板变成IOS苹果系统&#xff0c;这个工具除了可以刷安卓手机也可以刷安卓平板&#xff0c;网友实测&#xff0c;如果设备不支持的话软件会提醒不支持&#…

android高仿ios11系统,安卓仿ios11桌面全套文件

安卓手机想要苹果11的桌面的话&#xff0c;安卓仿ios11桌面全套文件app就可以帮您实现哦。安卓仿ios11桌面全套文件app是一款超级优质的手机桌面工具软件&#xff0c;平台上面拥有海量的壁纸资源&#xff0c;大家可以任意选取哦。 应用说明 修改负一屏效果 修改dock栏模糊度 修…

软件配置 | ios系统Clion下载、安装、配置环境

软件配置 软件配置 | ios系统Clion下载、安装、配置环境 软件配置下载、安装gClion 调试参考链接下载、安装调试 本文总结ios系统下Clion下载、安装、配置环境过程和可能碰到的问题。 因为是在私人电脑&#xff08;ios&#xff09;上配置的Clion&#xff0c;我还不太熟悉自己的…

iOS 13.0 至 13.7 平刷系统教程

来自 : 某QQ群分享文件&#xff0c;整理后发布 如侵权告知删除 关于 Succession 平刷插件信息&#xff1a; 插件&#xff1a;Succession 版本&#xff1a;1.4.15 开发者&#xff1a;Samg_is_a_Ninja 系统支持&#xff1a;iOS 10 至 13.7 用途&#xff1a;平刷当前系统 补充&am…

ios添加邮件收件服务器,iOS 系统邮件的基础使用

尽管有好多人的主力邮件是 Gmail,客户端的首选也是 Gmail,但是在国内的互联网环境中不可避免的要使用到本土的一些邮件服务。对于这些轻量级的服务我选择用系统自带的邮件应用进行统一的管理。本文主要讲解在系统自带邮件中,如何使用国内常用的邮件服务:如网易邮箱、QQ 邮箱…

关闭app服务器系统,ios12系统服务哪些关掉

类型&#xff1a;ios系统工具大小&#xff1a;38.7M语言&#xff1a;中文 评分&#xff1a;10.0 标签&#xff1a; 立即下载 ios12更新后&#xff0c;很多服务功能都开启了&#xff0c;是比较费电的&#xff0c;用户可以前往设置进行关闭来省电等&#xff0c;那ios12系统服务哪…

ios android 系统占用空间,iOS 系统占用了 20G 储存空间?别担心,教你快速解决!...

如果你曾经查看过自己 iOS 设备的储存空间使用情况&#xff0c;那么你可能见到过下面这种情形&#xff1a; 你可能发现了&#xff0c;系统所占据的空间太大了&#xff0c;远超过了正常的范围&#xff0c;这是怎么回事呢&#xff1f;下面就为大家解释一下出现这类情形的几种解决…

如何关闭iOS系统自动更新?最新屏蔽升级描述文件下载

新老司机朋友们晚上好&#xff0c;隔壁老王又来和大家见面了&#xff0c;鸽了有一段时间了&#xff0c;非常抱歉~ 众所周知&#xff0c;iOS 系统一直保持着较高的更新频率&#xff0c;但并不是所有用户都喜欢将自己的设备升级到最新版本&#xff0c;尤其是一些旧型号的 iPhone…

如何下载和安装 iOS开发教程

步骤 1: 在App Uploader网站&#xff0c;点击“Windows版本”下载 。 步骤 2: 在弹出框中&#xff0c;点击“下载”。 步骤 3&#xff1a;在弹出框中&#xff0c;点击“文件夹”打开。 步骤:4&#xff1a;右键选择“解压全部文件”。 步骤5&#xff1a;在弹出框中&#xff0c…

ios系统安装包下载_iOS在后台自动升级?一招教你屏蔽iOS更新

苹果产品一直被用户喜爱的最大的特点就是因为iOS系统&#xff0c;iOS系统有着流畅的体验以及完善的生态环境&#xff0c;因此历年新款iPhone都处于畅销状态。但是随着苹果旗下产品发布的越来越多&#xff0c;比如到目前为止苹果已经发布了15款iPhone产品&#xff0c;从最早的第…

ios系统安装包下载_iOS 屏蔽系统升级,描述文件版本已复活,无需越狱,请速度下载!...

沉寂已久的老方法,利用描述文件屏蔽 iOS 系统更新,目前已经正式恢复,再也不担心会自动下载更新包啦。 以往都是安装 tvOS 系列的描述文件,绕过苹果验证更新,从而达到阻止系统升级的目的,但是自 iOS 13 开始,安装 tvOS 12 会提示已过期或者失效。 而在当时,安装 tvOS 13…

如何下载和安装iOS 15公测版【附更新建议】

苹果在WWDC2021开发者大会上正式发布了iOS 15和iPadOS 15系统&#xff0c;推出了许多新功能&#xff0c;例如FaceTime共享、专注模式、实时文本、离线Siri、全新设计的通知等等。iOS 15和iPadOS 15的第一个公开测试版已于6月30日发布。 相信不少果粉已经迫不及待想要升级体验。…

氟化物超标怎么处理

项目基本信息 工艺及产品信息 甲方 / 采用工艺 过滤系统螯合树脂除氟系统 工程公司 / 工艺原理 废水除氟&#xff0c;耐受氯离子、硫酸根等阴离子的干扰 开始时间 2020/11/12 工艺特点 再生周期长 结束时间 2020/11/30 型号 CH-87 项目周期及项目地 15天 江…

lecory 波形二进制文件头(.trc)定义

1.文件头&#xff0c;从0字节开始 byte[] lecroy_trc_header new byte[]{0x23,0x39,0x30,0x30,0x32,0x30,0x30,0x30,0x31,0x34,0x34,0x57,0x41,0x56,0x45,0x44,0x45,0x53,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4C,0x45,0x43,0x52,0x4F,0x59,0x5F,0x32,0x5F,0x33,0x…

playwright - 剧作家, 端对端测试

本文基于 playwright v1.34.3, node v18.16.0 注意&#xff1a;playwright 版本随 node lts 版本更新而更新&#xff0c;所以请确保 node 版本与 playwright 版本匹配。 写在前面 前端开发阶段&#xff0c;少不了测试&#xff0c;一般包含两类测试&#xff1a;单元测试、端对端…

如何搭建苹果虚拟服务器降级,ios14怎么降级13.6 苹果iOS14降级超详细教程

iOS14相信很多朋友都体验过了&#xff0c;最近不少的小伙伴都升级到iOS14&#xff0c;但是对这个版本并不满意&#xff0c;那么iOS14怎么降级13.6呢?下面就来为大家分享一下苹果iOS14降级13.6的教程。 1、通过 iTunes 降级系统(注意事项&#xff1a;降级只能降级到最新的iOS 1…

苹果手机无法验证应用怎么办_苹果关闭iOS 14.0.1验证,用户将无法降级_

2020年10月28日 10:01 作者&#xff1a;陈沐梁 编辑&#xff1a;陈沐梁 文章出处&#xff1a;泡泡网原创 10月28日消息 在上周发布 iOS 14.1正式版之后&#xff0c;苹果今天停止了对 iOS 14.0.1的验证&#xff0c;这意味着用户无法再降级到该版本。 苹果通常会在新版本发布后停…