这道题和46题不一样的是有重复元素,所以只需在46题基础上面剪掉重复的就好了。
为了便于剪枝,而且有重复元素,所以我们需要给数组先排序 Arrays.sort(nums);
然后需要加上这个判断去剪掉重复的 if(i != 0 && nums[i] == nums[i - 1] && !visited[i - 1]){ continue;}
这个的含义我想了挺久的,终于想明白了,就是因为有重复元素,所以他只选择了重复元素都被使用的那一条路,其他的有重复元素,但是没有都被访问的就都抛弃了。
!visited[i - 1]和visited[i - 1]都是可以的,不一样的是前者按照面去剪枝,而后者按照路径剪枝,面的效率更高一点。
代码:
https://github.com/hanleirx/LeetCode/blob/master/47.%20%E5%85%A8%E6%8E%92%E5%88%97%20II
网友评论