Leetcode - Permutations II - 简书



Leetcode - Permutations II - 简书

和之前的 permutations 相比,多了重复。那么怎么解决这个重复问题呢?
比如, 1,1,2
一开始进入,
1,1,2
1,2,1
会出现这些情况,然后逐步退栈,直到ArrayList<Integer> permutations 空了。
然后访问, nums[1] -> 1
但其实,这个情况和之前 nums[0] -> 1 的情况一模一样,完全没必要再走一遍,还会多出重复的结果。那么,怎么解决呢?
我的打算是,每一层递归,建立一个哈希表。不需要作为参数传入,就保留在每一层。
然后,遍历一个数,就存进去,并且在遍历的时候判断下,该数是否已经存在于哈希表了。如果已经存在了,说明之前,重点, 之前 已经遍历过了该数。就不需要再遍历一次了。
但是无疑开销是巨大的,需要在每一层都申请哈希表,太浪费空间了。
于是上网查了,发现一种更简洁的做法,我也知道一定会有这么简洁的做法的。
提前先将nums数组排下序,然后重复的数组就会靠在一块儿了。
比如,1,1,2
那么,当我访问第二个1时,可能会有两种情况。
第一种情况,目前我位于第二层递归,前面已经有了一个1进入了permutations,所以我应该处理这个1.
第二种情况,目前我位于第一层递归,目前permutations是空的。但因为我之前的1已经完完整整处理过了一次类似的过程, 所以这个1就可以直接跳过了。
那么怎么区分这两种情况呢?
看,isVisited[i - 1] 是否为真。
如果为真,说明前面的1已经被访问过了,那么当前就在第二层递归。处理。
如果为假,如果前面的1未被访问,说明之前已经处理过一轮了,这一轮不需要再处理了。
那么,直接 continue;

然后就可以解决重复的问题了。
推荐一个博客,讲的


Read full article from Leetcode - Permutations II - 简书


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts