每天一道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,本项目文章所有代码都可以找到.

原文地址:https://www.cnblogs.com/baizx/p/11001537.html

时间: 2024-10-28 08:28:16

每天一道Rust-LeetCode(2019-06-11)的相关文章

[LeetCode] Palindrome Partition [11]

题目 Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s = "aab", Return [ ["aa","b"], ["a","a",&q

开荒日-2019/06/19

2019/06/19,毕业两年之际,个人原因来到了台州,这个对程序员来说不是很友好的地方,技术提升遇到了阻碍,想要从项目中学习东西但是收获甚微,还好现在的工作时间比较宽裕,让我有不少可以自由支配的时间,也算是到了工作的舒适区吧,但是此刻心里还是挺着急的,压力来源于对技术能力的渴望,却少有可以锻炼的机会.所以决定自己动手丰衣足食,打算开发一个自己的小产品,考虑了几天,打算搭建一个基础版本的OA平台(我现在的工作就是对一套OA系统进行二次开发),把开发过程中遇到的问题和新学的技术记录在博文中,以便以

2019.09.11学习整理

2019.09.11学习整理 进程基础 什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)

周记 - 2019年11月03日

2019年11月05日 2019年徐州区域赛结束了.封榜前3题铜牌前部,封榜后最后27分钟罚了4次通过E题.虽然4题罚时爆炸,不过万幸得了银牌后部.目前看应该还会再参加一年的,这个博客会不断更新记录最后一年参加比赛的学习进度(以及最后两年本科的其他事情),今年的目标是做一个真正的全能选手,首先希望在寒假结束前把Codeforces打到橙色(2100+),证明自己思维还行吧. 既然想做全能选手,每个专题都要学到省选级别吧,学习的分类就参照OI-Wiki的分类,题单的话,模板题从洛谷找,思维题从Co

一周极客分享2019年11月-第1周

一周极客分享2019年11月-第1周 本周极客分享周刊语录: 世界正在迅速电气化,轿车.卡车.摩托车.飞机都在变成电动设备.原因大致相同:运行更安静,维护需求减少,性能和效率更高,能源使用更加灵活. 职场人生 作为一名程序员,你真正了解CDN技术吗?真正的成熟,是明白世界上99%的事情,都不重要Java面试官:给Java面试者的八点建议2019最新BAT.TMD等等公司技术面试题及其答案 运维架构 用 Jenkins 构建 CI\/CD 流水线 | Linux 中国在 Linux 上用 stra

【誉天】2019年11月HCIE-R&S学员LAB认证考试成绩单合集

誉天2019年11月HCIE&RS学员LAB认证考试成绩单合集 出炉啦! 祝贺这些学员,并希望这些学员在接下来的面试考试中发挥同样优异的表现! HCIE证书正在向大家招手~ 电话:4008-868-010 QQ:1424150046 微信:誉天教育(yutianeduzs) [誉天]2019年11月HCIE-R&S学员LAB认证考试成绩单合集 原文地址:https://blog.51cto.com/13561944/2456441

tmux使用——2019年11月20日16:40:15

1.tmux 命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命令.用户与计算机的这种临时的交互,称为一次"会话"(session) . 会话的一个重要特点是,窗口与其中启动的进程是连在一起的.打开窗口,会话开始:关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完. 一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令.这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的

2019年11月06号工作总结

总结: 1.在测试过程中,需要场景覆盖全面,web端和wap端弱网场景的重要性不容忽视,今天电脑连接手机热点进行演示项目,出现数据加载偶尔失败的情况,虽然该场景在正常网速下会出现慢查询的情况,解决方案为:延长请求加载时间,当请求加载时间达到预设值的时候,界面会提示数据加载失败,需要重新加载. 2.上传视屏大小限制,后台服务默认上传视屏的限制较小,需要进行重新配置后才可以上传较大的文件,今天的问题是,客户上传300m视屏文件,没有上传成功.解决方案:对后台服务进行重新配置,重新发布服务后,可以正常

抑郁症:2019年11月19日

重度抑郁症确诊第1天,坚持记录第1天 早上 在学校上课,和班主任请假下午去医院检查,没告诉班主任检查什么. 下午 Chicago_01 2019/11/09 14:01:32 14:01 到家了,准备去医院 Chicago_01 2019/11/09 14:01:38 Chicago_01 2019/11/09 14:20:36 14:20 到医院了 Chicago_01 2019/11/09 14:21:05 Chicago_01 2019/11/09 14:53:06 14:52 换一个医院

每日一道shell练习(06)——检测端口服务

1. 题目 写一个脚本,判断本机的80端口(假设服务为httpd)是否开启着,如果开启着就什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己.脚本写好后,每分钟执行一次,也可以写一个死循环的脚本,30S检查一次. 2. 习题分析 首先,我们要区分要求,这里的要求是检测80端口是否在监听,而不是检测httpd服务是否运行,虽然两者有一定的联系,但并不是对等的关系.检测端口状态用 netstat -lntp 命令.如果要求检测远程主机的端口状态,则用一下的命令: nmap