每天一道Rust-LeetCode(2019-06-11)
每天一道Rust-LeetCode(2019-06-02) Z 字形变换
坚持每天一道题,刷题学习Rust.
题目描述
全排列 II
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
解题过程
思路:
因为要穷举结果,所以只能用穷举的办法.
思路:
对于完全不重复的数字,找到所有可能组合的办法:
[1]
对于1,2
则是
[2,1]
[1,2]
于1,2,3
则是
[3,2,1] [2,3,1],[2,1,3] 遍历前一个,在所有可能的位置插入新来的数字即可.
[3,1,2] [1,3,2] [1,2,3]
这种方式的坏处是要不停地移动,插入,
从头开始的方法:
首先选定最开始的位置,还以[1,2,3]举例,那么
一开始是:
1 [2,3]组合
2 [1,3]组合
3 [1,2]组合
如果碰到重复的数字直接跳过进行下一个.
这样一轮下来以后[1,2,3]变成了[3,1,2],需要修复一下.
struct Solution {}
impl Solution {
pub fn permute_unique(nums: Vec<i32>) -> Vec<Vec<i32>> {
if nums.len() == 0 {
return Vec::new();
}
let mut nums = nums;
nums.sort();
let nl = nums.len();
return Solution::permute_interna(&mut nums[0..nl], nl);
}
fn permute_interna(nums: &mut [i32], n: usize) -> Vec<Vec<i32>> {
if nums.len() == 1 {
let mut v = vec![0; n];
v[n - 1] = nums[0];
let mut vs = Vec::new();
vs.push(v);
return vs;
}
let mut vs2 = Vec::new();
let nl = nums.len();
// println!("enter={:?}", nums);
// let mut nums2 = Vec::new();
// for i in 0..nl {
// nums2.push(nums[i]);
// }
for i in 0..nums.len() {
if i > 0 && nums[i] == nums[0] {
continue; //重复的数字
}
let t = nums[i];
nums[i] = nums[0];
nums[0] = t;
let mut vs = Solution::permute_interna(&mut nums[1..nl], n);
for v in &mut vs {
v[n - nums.len()] = nums[0]; //把刚刚选定的队首放进去
}
vs2.append(&mut vs)
}
//nums里面的顺序回复一下
let t = nums[0];
for i in 1..nl {
nums[i - 1] = nums[i]; //有没有现成的函数可以使用呢?
}
nums[nl - 1] = t;
// println!("exit={:?}", nums);
// assert_eq!(nums, &mut nums2[0..nl]);
vs2
}
}
mod test {
use super::*;
#[test]
fn test_permute() {
println!("v={:?}", Solution::permute_unique(vec![2, 2, 1, 1]))
}
}
一点感悟
其他
欢迎关注我的github,本项目文章所有代码都可以找到.
每天一道Rust-LeetCode(2019-06-11)的更多相关文章
- BlackArch Linux 2019.06.01 宣布发布
导读 BlackArch Linux是一个基于Arch Linux的发行版,专为渗透测试人员和安全研究人员设计,并包含大量渗透测试和安全实用程序,已宣布发布2019.06.01版本. BlackArc ...
- 2019年11个javascript机器学习库
Credits: aijs.rocks 虽然python或r编程语言有一个相对容易的学习曲线,但是Web开发人员更喜欢在他们舒适的javascript区域内做事情.目前来看,node.js已经开始向每 ...
- tmux使用——2019年11月20日16:40:15
1.tmux 命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命令.用户与计算机的这种临时的交互,称为一次"会话& ...
- 打开随身U盘_办公专用盘 2019年11月29日
;;; ; 打开随身U盘_办公专用盘 2019年11月29日 ; https://www.autoahk.com/?p=16553; https://www.cnblogs.com/delphixx/ ...
- 'Rem EverythingAutoSetup.VBS 安装Everything的VBS脚本 2019年11月25日写
'Rem EverythingAutoSetup.VBS 安装Everything的VBS脚本 2019年11月25日写 'Rem Everything是voidtools开发的一款本地NTFS文件和 ...
- 键盘和鼠标闲置超时时关闭显示器并锁定电脑桌面的AutoHotkey脚本 2019年11月24日写
/* 键盘和鼠标闲置超时时关闭显示器并锁定电脑桌面的AutoHotkey脚本 2019年11月24日写 在电脑桌面锁定时移动鼠标就会显示登录界面,此时即使超过电源设置的时间电脑也不会关闭显示器使得屏幕 ...
- 译文 [ROM][多国语言][2015.06.11] Lenovo S750 (MTK6589) - andrea_d86-lenovos750-4.2.2
************************************************** andrea_d86-lenovos750-4.2.2-150530 ************** ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- Leetcode题库——11.盛最多水的容器
@author: ZZQ @software: PyCharm @file: maxArea.py @time: 2018/10/11 21:47 说明:给定 n 个非负整数 a1,a2,...,an ...
- 「2019.8.11 考试」一套把OI写的很诗意的题
这次写的更惨了,T2暴力再次挂掉了. 先写了T1的75暴力,然后写了T2的70分暴力(挂成了25),T3啥也不会骗了12分.T3看完题一点思路没有,心态爆炸了,一直在观察数据,忽略的思考的重要性,以至 ...
随机推荐
- 洛谷P1283 平板涂色 &&一本通1445:平板涂色
题目描述 CE数码公司开发了一种名为自动涂色机(APM)的产品.它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色. 为了涂色,APM需要使用一组刷子.每个刷子涂一种不同的颜色C.APM拿 ...
- 【cf比赛记录】Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)
比赛传送门 只能说当晚状态不佳吧,有点头疼感冒的症状.也跟脑子没转过来有关系,A题最后一步爆搜没能立即想出来,B题搜索没有用好STL,C题也因为前面两题弄崩了心态,最后,果然掉分了. A:简单数学 B ...
- 行为驱动:Cucumber + Java - 实现数据的参数化
1.什么是参数化 实际设计测试用例过程中,我们经常会用等价类.边界值这样的方法,针对一个功能进行测试数据上的测试,比如一个输入框,正向数据.逆向数据,非法输入等等 2.Cucumber的数据驱动 同上 ...
- HTML+css基础 css选择器 选择器的权重
css选择器 选择器的权重 在css中,哪个选择器的权重高,就走谁的样式 标签选择器的权重是1 class选择器的权重是10 Id选择器的权重是100 行间样式的权重是1000 带有关键字 !imp ...
- re2c安装
wget https://kojipkgs.fedoraproject.org//packages/re2c/1.1.1/3.fc31/src/re2c-1.1.1-3.fc31.src.rpm 解 ...
- Tsung 安装
1. Tsung是什么,有哪些特性? Tsung是一个开源.多协议.分布式的压力测试工具.它可以用来测试HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP 和Jab ...
- CSS的基础学习
CSS学习 --------学习资源 http://www.csszengarden.com/ CSS语法检查http://jigsaw.w3.org/css-validator/ 配置CSS的方法: ...
- shell脚本语言与linux命令的联系与区别
使用linux肯定是要会使用命令的,就算提供有用户界面,绝大部分功能还是要通过命令行去操作的.而shell脚本语言也是运行在linux上的脚本语言,对于服务器运维人员也是几乎必须要掌握的.而shell ...
- 【MySQL】对数据库和表的增删改查
数据库的基本概念 数据库的英文单词: DataBase 简称 : DB 什么是数据库? 用于存储和管理数据的仓库. 数据库的特点: 持久化存储数据的.其实数据库就是一个文件系统 方便存储和管理数据 使 ...
- 《 .NET并发编程实战》扩展阅读 - 元胞自动机 - 1 - 为什么要学元胞自动机
先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.