查看: 971| 回复: 2
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] 47题去重,求解!

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
如题,第27行,这个 ! used[i-1] 怎么理解?  

求一粒米~

  1. class Solution {
  2.    
  3.     public List<List<Integer>> permuteUnique(int[] nums) {
  4.         
  5.         List<List<Integer>> list = new ArrayList<>();
  6.         
  7.         Arrays.sort(nums);
  8.         
  9.         backtrack(list, new ArrayList<>(), nums, new boolean[nums.length]);
  10.         
  11.         return list;
  12.     }

  13.     private void backtrack( List<List<Integer>> list,
  14.                              List<Integer> tempList,
  15.                              int [] nums,
  16.                              boolean [] used)
  17.     {   
  18.         if(tempList.size() == nums.length){
  19.             
  20.             list.add(new ArrayList<>(tempList));
  21.             
  22.         } else{
  23.             
  24.             for(int i = 0; i < nums.length; i++){
  25.                
  26.                 if( ( used[i] ) || ( i > 0 && nums[i] == nums[i-1] && !used[i - 1] ) ) continue;
  27.                  
  28.                 tempList.add(nums[i]);  used[i] = true;
  29.                
  30.                 backtrack(list, tempList, nums, used);
  31.                  
  32.                 tempList.remove(tempList.size() - 1);  used[i] = false;
  33.             }
  34.         }
  35.     }
  36. }
复制代码


评分

参与人数 2大米 +2 收起 理由
sierrayyyy + 1 给你点个赞!
14417335 + 1 给你点个赞!

查看全部评分


上一篇:请教:关于206. Reverse Linked List
下一篇:请教:关于Linked List的两大困惑
🔗
jygooooo 2020-8-26 03:28:06 | 只看该作者
全局:
这个方法在backtracking的时候的过程是这样的:

假如input:“abc"

第一层                        a                     b                  c
                                 /      \               /      \            /      \         
第二 层                  b        c            a        c        a        b
                               |          |             |         |         |         |
第三层                   c        b            c        a        b        a

每次把某个字母放到某一层后要把这个字母设为used,所以不会在以后的层中再用到这个字母。


假如input=“abb'c"     (第二个b加了上标便于区分)可以发现排序的要求是b和b'不能同时放在某一层,但是可以出现在不同层。

不能同时放在某一层:
第一层                        a                     b                  b'              c                       //b和b'同时放在第一层,不可以
                                 /      \               /      \            /      \                                   
第二层                   b        c   ...      a        c  ...   a        b
                               |          |             |         |         |         |
第三层                                          ... ...

不然会出现这种情况:
第一层                       a       b      b'
第二层                      ...       b'     b

于是最后出现重复的排列。。。

解决办法就是遇到重复出现的字母时(例如在第一层遇到了b'),只有在前一个设置为used了的情况下才能用之后重复的字母,前面相同的字母used了说明它们放在了之前的不同层,不在当前层,所以可以在这一层放前面层出现了的字母
如果前面重复的字母没有标为used,就会出现一样的字母出现在不同path的同一层,就会出现重复(例如bb'a和b'ba)

希望能帮助到lz。。。

评分

参与人数 1大米 +1 收起 理由
zurich.hill + 1 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
 楼主| zurich.hill 2020-8-26 04:11:21 | 只看该作者
全局:
jygooooo 发表于 2020-8-26 03:28
这个方法在backtracking的时候的过程是这样的:

假如input:“abc"

可以认识一下吗,感谢您这么细心的解释~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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