题解 | #有重复项数字的全排列#

有重复项数字的全排列

https://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param num int整型一维数组 
     * @return int整型二维数组
     */
    var prefixStrArr = [String]()
    func permuteUnique( _ num: [Int]) -> [[Int]] {
        if let arr = sortNums(prefix:"", num: num) {
            return arr
        } else {
            return [[Int]]()
        }
    }
    
    func sortNums(prefix:String, num: [Int]) -> [[Int]]? {
        var nums = num.sorted(by: <)
        if !prefixStrArr.contains(prefix) {
            prefixStrArr.append(prefix)
        } else {
            return nil
        }
        if nums.count == 1 {
            var arr = [[Int]]()
            arr.append([nums[0]])
            return arr
        }
        // 保持位置不变,跟后面的每个交换位置 2种情况
        // 看看之前有没有排序
        
        var totalArr = [[Int]]()
        for i in 0 ... nums.count - 1 {
            (nums[0], nums[i]) = (nums[i], nums[0])
            var prefix = prefix + "\(nums[0])"
            if let arr = sortNums(prefix:prefix, num:Array(nums[1 ... nums.count - 1])) {
                insertArr(&totalArr, arr, nums[0])
            }
            (nums[0], nums[i]) = (nums[i], nums[0])
        }
        return totalArr
    }
    
    func insertArr(_ totalArr:inout [[Int]],_ arr:[[Int]],_ addNum:Int) {
        for value in arr {
            var row = value
            row.insert(addNum, at: 0)
            totalArr.append(row)
        }
    }
}

全部评论

相关推荐

01-07 15:50
四川大学 Java
看日出看日落:好好背八股,做算法。我身边跟你bg差不多的基本都大厂暑期
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务