914. 卡牌分组(Swift)

作者: entre_los_dos | 来源:发表于2019-07-03 13:55 被阅读0次

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards

    题目

    给定一副牌,每张牌上都写着一个整数。

    此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:

    每组都有 X 张牌。
    组内所有的牌上都写着相同的整数。
    仅当你可选的 X >= 2 时返回 true。

    示例 1:

    输入:[1,2,3,4,4,3,2,1]
    输出:true
    解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]
    

    示例 2:

    输入:[1,1,1,2,2,2,3,3]
    输出:false
    解释:没有满足要求的分组。
    

    示例 3:

    输入:[1]
    输出:false
    解释:没有满足要求的分组。
    

    示例 4:

    输入:[1,1]
    输出:true
    解释:可行的分组是 [1,1]
    

    示例 5:

    输入:[1,1,2,2,2,2]
    输出:true
    解释:可行的分组是 [1,1],[2,2],[2,2]
    

    提示:

    1 <= deck.length <= 10000
    0 <= deck[i] < 10000
    

    先排序,然后求相同数的个数 的 最大公约数。

    方法

    func getSameNum(num1: Int, num2: Int) -> Int {
            
            if num1 == 1 || num2 == 1 {
                return 0
            }
            if num1 == num2 {
                return num1
            }
            
            var maxNum = max(num1, num2)
            var minNum = min(num1, num2)
            while maxNum - minNum > 1 {
                
                let modNum = maxNum % minNum
                
                if modNum == 0 {
                    return minNum
                }
                if modNum == 1 {
                    return 0
                }
                maxNum = max(modNum, minNum)
                minNum = min(modNum, minNum)
                
                if maxNum % minNum == 0 {
                    return minNum
                }
                
            }
            return 0
    
        }
            
        func hasGroupsSizeX(_ deck: [Int]) -> Bool {
            
            if deck.count < 2 {
                return false
            }
            //先排序
            let deckSort = deck.sorted()
            var sameNum = 0
            var X = 0
            
            var currentNum = deckSort[0]
            
            
            //然后找出一样的值
            for num in deckSort {
                //如果值相等,sameNum+1
                //如果值不相等,判断sameNum 是否>=2。并判断X%sameNum是否=0
                if num == currentNum {
                    sameNum += 1
                }else {
                    if X == 0 {
                        X = sameNum
                    }
                    if sameNum < 2 {
                        return false
                    }
                    
                    X = getSameNum(num1: X, num2: sameNum)
                    
                    if X == 0 {
                        return false
                    }
                    sameNum = 1
                    currentNum = num
                }
            }
            if X == 0 || X == sameNum {
                return true
            }
            
            return (getSameNum(num1: X, num2: sameNum) == 0) ? false : true
            
        }
    
    image.png

    相关文章

      网友评论

        本文标题:914. 卡牌分组(Swift)

        本文链接:https://www.haomeiwen.com/subject/trwfhctx.html