刷题46. Permutations
一、题目说明
题目是46. Permutations,给一组各不相同的数,求其所有的排列组合。难度是Medium
二、我的解答
这个题目,前面遇到过类似的。回溯法(树的深度优先算法),或者根据如下求解:
我考虑可以用dp做,写了一个上午,理论我就不说了,自己看代码:
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
class Solution{
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<vector<int>> next;
unordered_map<int,vector<vector<int>>> dp;
vector<int> cur;
if(nums.empty()) return res;
cur.push_back(nums[0]);
res.push_back(cur);
dp[1] = res;
int currLength = 2;
for(int j=1;j<nums.size();j++){
res = dp[j];
next.clear();
for(int k=0;k<currLength;k++){
cur.clear();
cur.resize(j+1);
for(int m=0;m<res.size();m++){
cur[k] = nums[j];
int t1=0,t2=0;
while(t2<res[m].size()){
if(cur[t1]!=nums[j]){
cur[t1] = res[m][t2];
}else{
++t1;
cur[t1] = res[m][t2];
}
t1++;
t2++;
}
next.push_back(cur);
cur.clear();
cur.resize(j+1);
}
}
currLength++;
dp[j+1] = next;
}
return dp[nums.size()];
}
};
int main(){
Solution s;
vector<int> nums = {1,2,3,4};
vector<vector<int>> r = s.permute(nums);
for(int i=0;i<r.size();i++){
for(int j=0;j<r[i].size();j++){
cout<<r[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}
性能如下:
Runtime: 8 ms, faster than 98.85% of C++ online submissions for Permutations.
Memory Usage: 9.5 MB, less than 46.27% of C++ online submissions for Permutations.
三、优化措施
dp算法,是按照空间换时间的,所以时间还可以,空间就差了点。
下面是回溯算法的代码,可读性好多了:
class Solution{
private:
vector<vector<int>> result;
vector<int> path;
vector<bool> used;
public:
//枚举每个位置放哪个数
void dfs(const vector<int>&nums,int pos){
if(pos == nums.size()){
result.push_back(path);
return;
}
for(int i=0;i<nums.size();i++){
if(!used[i]){
path.push_back(nums[i]);
used[i] = true;
dfs(nums,pos+1);
used[i] = false;
path.pop_back();
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
if(nums.empty()){
return result;
}
used.resize(nums.size());
dfs(nums,0);
return result;
}
};
刷题46. Permutations的更多相关文章
- [刷题] 46 Permutations
要求 整型数组,每个元素不相同,返回元素所有排列的可能 示例 [1,2,3] [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 树 ...
- leetcode刷题-46全排列
题目 给定一个 没有重复 数字的序列,返回其所有可能的全排列. 思路 回溯算法 不断取出字符,对剩余字符进行选择 实现 class Solution: def permute(self, nums: ...
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- Leetcode OJ 刷题
Valid Palindrome吐槽一下Leetcode上各种不定义标准的输入输出(只是面试时起码能够问一下输入输出格式...),此篇文章不是详细的题解,是自己刷LeetCode的一个笔记吧,尽管没有 ...
- leetcode刷题指南
转载自:http://blog.csdn.net/lnho2015/article/details/50962989 以下是我个人做题过程中的一些体会: 1. LeetCode的题库越来越大,截止到目 ...
- leetcode 刷题记录(java)-持续更新
最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...
- 1、学习算法和刷题的框架思维——Go版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- leetcode刷题总结一
大四狗找工作,要刷题了,leetcode上面题目比较适合面试算法类题目,也不纯粹为了蒙题,锻炼一下面试类型的思维 Single Number: 有N个数,其中只有一个数出现了一次,其他都是两次,找出那 ...
- 【刷题记录】BZOJ-USACO
接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...
随机推荐
- EXTjs开发————优雅的用extjs写一个柱状图
简单的写法,extjs可以直接引用插件来写,这里将我发表在百度文库的文档简述下来,有兴趣也可以关注我的百度文库,ID:该用户已失踪. 主要部分的代码: $(document).ready(functi ...
- 047、Java中使用if…else if…else判断
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- Essay Fail?可能是引用出了问题
新学期伊始,又有不少成功与雅思分手的学生们海外入学.本以为可以稍微喘口气,却发现漫天的essay接踵而至.因此,Hotessay小编为新瓜蛋子们特地准备了一期essay写作的干货.还不赶紧学起来,用到 ...
- git commit -m 和 git commit -am 区别
git commit -m 和 git commit -am 通常修改一个文件 并且将文件提交到本地分支的命令是: git add . git commit -m 'update' 以上两个命令其实可 ...
- win10热键体验
Alt+Tab: 横向显示正在执行的进程 Win+Tab: 3D形式展示正在执行的进程 Win+D:返回桌面(逃领导查电脑和放窥屏尴尬) Win+R: run(直接打开文件开始运行) crtl+Alt ...
- 指令——less
一.Liunx系统下的一般命令格式. 命令——实际上就是在Liunx终端中,在命令行中输入的内容. Liunx中一个命令的完整格式为: #指令主体(空格) [选项](空格) [操作对象] 指令主体—— ...
- 7. 单机版Redis的安装以及Redis生产环境启动方案
安装单机版redis redis的生产环境启动方案redis cli的使用 1. 安装单机版redis 大家可以自己去官网下载,当然也可以用课程提供的压缩包 wget http://downloads ...
- MySQL过程和游标
BEGIN DECLARE f_leastCount INT DEFAULT 100; DECLARE f_ratio FLOAT DEFAULT 0.8; DECLARE i_channel VAR ...
- Django 初体验
Django 依赖的python 基础环境安装: https://www.runoob.com/django/django-install.html Django安装参考官网文档: https://d ...
- sublime text 常用插件安装
一.安装方法 ctrl+ship+p —— 在弹出的地方输入 pci (package control: install pagckage)—— 再输入 要安装的包名 二.一步过慢或失败解决: 原因: ...