Given a collection of distinct numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3][1,3,2][2,1,3][2,3,1][3,1,2], and [3,2,1].

分析:

采用从nums[0..i-1]递推出nums[0..i]的排列 个数变成了原来的(i+1)倍. 比如,之前nums中的元素是[1,2,3],进行排列的时候我们可以先得到前两个的为[1,2]和[2,1]. 当再加入元素3的时候,针对[1,2]这个排列3有三个空可以插进去变成[3,1,2],[1,3,2]和[1,2,3]. 对[2,1]同理可变成[3,2,1],[2,3,1]和[2,1,3].

/*** 采用从nums[0..i-1]递推出nums[0..i]的排列 个数变成了原来的(i+1)倍.* 比如,之前nums中的元素是[1,2,3],进行排列的时候我们可以先得到前两个的为[1,2]和[2,1].* 当再加入元素3的时候,针对[1,2]这个排列3有三个空可以插进去变成[3,1,2],[1,3,2]和[1,2,3].* 对[2,1]同理可变成[3,2,1],[2,3,1]和[2,1,3]*/public List<List<Integer>> permute(int[] nums) {List<List<Integer>> list = new ArrayList();List<List<Integer>> tempList = new ArrayList();//临时存储的元素int len = nums.length;if(len<=0){return list;}/*初始化list中只有一个元素的情况*/ArrayList<Integer> list1 = new ArrayList<Integer>();//表示外层list的一个元素list1.add(nums[0]);list.add(list1);/*进入循环从nums[0..i-1]递推出nums[0..i]的排列*/for(int i=1;i<len;i++){int size = list.size();//i-1的时候排列的集合个数,相当于nums = [1,2,3],只排列了前两个时得到的[[1,2][2,1]]的长度for(int j=0;j<size;j++){list1 = (ArrayList<Integer>) list.get(j);//取出i-1的一个集合,相当于取出[[1,2][2,1]]中的[1,2]int size1 = list1.size();for(int k=0;k<=size1;k++){//找nums[i]可以插进去的位置ArrayList<Integer> list2 = new ArrayList<Integer>();list2.addAll(list1.subList(0, k));list2.add(nums[i]);list2.addAll(list1.subList(k, size1));tempList.add(list2);}}/*list首先把之前的元素都清空,然后全部装上最新的元素*/list.clear();list.addAll(tempList);tempList.clear();}return list;}

方法二:

采用全排列的思想做。求全排列的过程就是把数字与其后面的数字相交换的过程。

IList<IList<int>> result = new List<IList<int>>();public IList<IList<int>> Permute(int[] nums){if (nums.Length > 0){Permutation(nums, 0);}return result;}/** nums 表示待排序的字符数组* beginIndex表示开始全排列的下标*/public void Permutation(int[] nums, int beginIndex){int len = nums.Length;/** 说明排序到了最后一个字符,则可以把目前的字符数组转化为字符串加入到最后的结果中* 这也是终止递归的条件。*/if (beginIndex == len - 1){IList<int> list = new List<int>(nums);result.Add(list);return;}/* * 如果当前开始排序的字符不是最后一个字符,则* 1.把这个字符与其后面的所有字符位置相互换;* 2.然后递归为开始全排列的下标为beginIndex+1;* 3.最后要把第一步中交换的两个字符拿回来,保证charArr还是初始的待排序的字符数组。* */else {//index对应的字符表示需要与beginIndex对应的下标交换的字符/* 1.把这个字符与其后面的所有字符位置相互换;*/for (int index = beginIndex; index < len;index++){Swap(nums,beginIndex,index);/*2.然后递归为开始全排列的下标为beginIndex+1;*/Permutation(nums, beginIndex+1);/*3.最后要把第一步中交换的两个字符拿回来,保证nums还是初始的待排序的字符数组。*/Swap(nums,beginIndex,index);}}}private void Swap(int[] nums, int i, int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;} 

99. Permutations相关推荐

  1. CF 1093 E. Intersection of Permutations

    E. Intersection of Permutations 链接 题意: 给定两个序列,询问第一个排列的[l1,r1]和第二个排列[l2,r2]中有多少个共同的数,支持在第二个排列中交换两个数. ...

  2. hdu5338 ZZX and Permutations(贪心、线段树)

    转载请注明出处: http://www.cnblogs.com/fraud/           --by fraud ZZX and Permutations Time Limit: 6000/30 ...

  3. 凯撒密码、GDP格式化输出、99乘法表

    1.恺撒密码的编码 plaincode = input('明文:') print('密文:',end='') for i in plaincode: print(chr(ord(i)+3),end=' ...

  4. 金融时报:谷歌撤离中国有99.9%的可能性

    据国外媒体报道,英国<金融时报>周六发表文章称,谷歌与中国政府就监管问题的谈判显然陷入僵局,而这家世界最大的搜索引擎关闭中国业务现在有99.9%的可能性. <金融时报>称,谷歌 ...

  5. yahoo註冊.com 域名1.99$/年

    yahoo註冊.com 域名1.99$/年 趕快去註冊吧 http://order.sbs.yahoo.com/ds/reviewplanoption?.p=YD1&m=dom&.sr ...

  6. MIT开发新加密货币,用户所需数据比比特币减少99%

    MIT的研究人员开发了一种新的加密货币,大大减少了用户加入网络和验证交易所需的数据,与当今流行的加密货币相比,最高可达99%.这意味着网络更具扩展性. 像比特币之类流行的加密货币都是构建于区块链上的网 ...

  7. 学习成长就到鸿蒙思维,庆国庆,迎中秋,鸿蒙教育享双节99元开启思维之旅!!...

    原标题:庆国庆,迎中秋,鸿蒙教育享双节99元开启思维之旅!! 庆国庆,迎中秋,鸿蒙教育享双节99元开启思维之旅!! 鸿蒙口才+绘画课推出99元体验课程!学1科️1节课程不过瘾,️ 学2科️ ️4节课怎 ...

  8. 安装hadoop下的sqoop1.99.3及配置问题全解决

    2016年8月27日,解决sqoop 先下载的是sqoop1.99.7,结果配置的时候,出现了没有server/conf目录,以及启动时出现无法配置错误 ./bin/sqoop.sh server s ...

  9. 突然想起99年的那次离别

    今天妹妹离开成都回家了 突然发现某一件事情又那么蹿了出来了,是99年的秋天那次,同f到成都且分开的那短暂的2天! 很多年了,不知道是忘记了再回忆起,还是一直埋在最深处,瞬间又重现! 想了,有一种泛黄的 ...

最新文章

  1. boost::dijkstra_shortest_paths用法的测试程序
  2. Linux并发服务器编程之多线程并发服务器
  3. Unity的几个特殊文件夹
  4. asp.net 页面静态化
  5. 检索COM类工厂组件的CLSID 80040154(不容易啊!!) 80040154.
  6. php面试中的经典问题
  7. 【英语学习】【Daily English】U03 Leisure Time L04 I need to squeeze in some time for reading
  8. 解决Python查询Mysql中文乱码问题
  9. 拓端tecdat|R语言Poisson回归的拟合优度检验
  10. Android 10.0修改语言设置简体中文(中国)为简体中文(中国大陆)
  11. ViewPage的基本使用以及动画效果的添加
  12. python函数自己调用自己_python怎么调用自己的函数
  13. html插入cad,cad插件有哪些
  14. conda安装编译好了的caffe, ImportError: cannot import name ‘_validate_lengths‘
  15. Window拷贝文件到Ubuntu虚拟机
  16. QT获取当前目录的上一级目录dir->cdUp()
  17. 凸优化笔记6(共轭梯度法)
  18. 我相信,一定有那么一句话可以温暖你的心
  19. 计算机网络被病毒攻击怎么办,电脑被病毒入侵了怎么办
  20. jsp物流信息发布管理平台

热门文章

  1. (1.3.3)插入排序:直接插入、交换插入、折半插入
  2. tightvnc viewer 传文件_树莓派使用VNC连接和FileZilla传文件
  3. 真相了,为什么你的产品火不了
  4. 使用Python执行系统命令方法
  5. 图解企业战略规划的经典分析工具:SWOT、QCDMS、PEST、五力分析
  6. 为什么谷歌浏览器无法添加扩展程序
  7. python中html.parser_Python html.parser库学习小结
  8. memset()函数使用详解
  9. 服务器提示远程桌面忙,远程桌面正忙无法完成执行任务解决方法
  10. python文件读取写入元组_python文件的读写