设为首页 收藏本站
查看: 648|回复: 0

[经验分享] 46. Permutations

[复制链接]

尚未签到

发表于 2017-7-4 22:02:42 | 显示全部楼层 |阅读模式
  题目:










  Given a collection of 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].


Hide Tags Backtracking  链接: http://leetcode.com/problems/permutations/
  4/15/2017
  6ms, 78%
  按照之前backtracking的公式往上套,怎么都不对,忽然想起来这个permutation可能并不一样。
  combination之类的在意的主要是元素,而permutation更在意元素+顺序。所以在进入recursive之前就要让list里有所有元素,然后在recursive function中进行swap
  注意第6,7行,第18,20行,这个与下面算法班的写法不同。
  再看一遍别人的答案,其实temp也可以不需要,直接在nums上进行位置互换就可以了。



public class Solution {
     public List<List<Integer>> permute(int[] nums) {
         List<List<Integer>> ret = new ArrayList<>();
         ArrayList<Integer> temp = new ArrayList<Integer>();
         if (nums.length == 0) return ret;
         for (int i = 0; i < nums.length; i++) {
             temp.add(nums);
         }
         enumerate(nums, ret, temp, 0);
         return ret;
     }
     private void enumerate(int[] nums, List<List<Integer>> ret, ArrayList<Integer> temp, int pos) {
         if (pos == nums.length) {
             ret.add(new ArrayList<Integer>(temp));
             return;
         }
         for (int i = pos; i < nums.length; i++) {
             exchange(temp, pos, i);
             enumerate(nums, ret, temp, pos + 1);
             exchange(temp, i, pos);
         }
     }
     private void exchange(ArrayList<Integer> temp, int i, int j) {
         int tmp = temp.get(i);
         temp.set(i, temp.get(j));
         temp.set(j, tmp);
     }
}
  4/22/2017
  算法班
  算法班是通过不断判断是否元素已存在,若不存在加入新的值,处理后减去加入的值来做的。注意主函数中并不需要事先把元素都放进去



class Solution {
     /**
      * @param nums: A list of integers.
      * @return: A list of permutations.
      */
     public List<List<Integer>> permute(int[] nums) {
         // write your code here
         List<List<Integer>> result = new ArrayList<>();
         List<Integer> list = new ArrayList<>();
         
         if (nums == null || nums.length == 0) {
             result.add(list);
             return result;
         }
         
         search(nums, list, result);
         return result;
     }
     
     public void search( int[] nums,
                         List<Integer> list,
                         List<List<Integer>> result) {
                             
         if (list.size() == nums.length) {
             result.add(new ArrayList(list));
         }                    
                 
         for (int i = 0; i < nums.length; i++) {
             if (list.contains(nums)) {
                 continue;
             }
             list.add(nums);
             search(nums, list, result);
             list.remove(list.size() - 1);
         }
         
         return;
     }
}
  参考的是:
  https://www.cs.princeton.edu/courses/archive/fall12/cos226/lectures/67CombinatorialSearch.pdf
  别人的一个总结,但是我并不觉得总结得很好
  https://discuss.leetcode.com/topic/46162/a-general-approach-to-backtracking-questions-in-java-subsets-permutations-combination-sum-palindrome-partioning
  另外一个别人的算法,用的是iterative,但是我不准备研究了
  https://discuss.leetcode.com/topic/6377/my-ac-simple-iterative-java-python-solution
  更多讨论:
  https://discuss.leetcode.com/category/54/permutations
  以及各种方法总结,值得看看next permutation
  http://www.cnblogs.com/yrbbest/p/4436346.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390805-1-1.html 上篇帖子: poj 2240 Arbitrage ([kuangbin带你飞]专题四 最短路练习) 下篇帖子: 【转载】java实现rabbitmq消息的发送接受
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表