数组去重全排列解法
俗话说“要想代码写得好,算法思想不能少”,作为程序员有空了多看看算法肯定不吃亏,记录下自己学习算法处理全排列问题的方法。
已知数组[A,B,C,C],求数组全排列结果且不重复?
遇到这个问题首先让我回想起,当年学排列组合时,老师拿球球摆放的画面:
A,B,C先摆成ABC、BAC、CBA三种情况
以此类推ABC可继续摆成ABC和ACB两种情况,BAC可摆成BCA和BAC两种情况,CBA可摆成CBA和CAB两种情况,最终得出ABC全排列结果,那么用程序是如何实现这种思想呢?
var?permuteUnique?=?function(arr){
????var?res?=?[],
? ? ? ? i=0
????var?main?=?function(arr?,i){
? ? //递归到最后一位时将去重后的全排列情况保存
????if(i===arr.length){
? ? ? ? isExistArr(res,arr)?"":res.push(arr)
????}
????for(var j=i;j<arr.length;j++){
????????let?arr1?=?[...arr]
????????let?t?=?arr1[i]
????????arr1[i]?=?arr1[j]
????????arr1[j]?=?t
????????main(arr1,i+1)
????????}
????}
????main(arr,i)
????return?res
}
//去重
var?isExistArr?=?(arr,s)=>{
??var?len=arr.length
??var?compareStr?=?s.join("")
??for(var?i=0;i<len;i++){
??????var?itemStr?=?arr[i].join("")
??????if(itemStr?===?compareStr){
??????????return?true
??????}
??}
??return?false
}
var?nums?=?[1,2,3,4,4]
permuteUnique(nums)