Skip to content

LeetCode题解:2347. 最好的扑克手牌,哈希表,详细注释 #403

Description

@chencl1986

原题链接:
https://leetcode.cn/problems/best-poker-hand/

理解题意:

  1. 有五张相同花色的扑克牌,与五张扑克牌只有一种花色意思相同
  2. 五张大小互不相同的扑克牌,与共有五种大小的扑克牌意思相同
  3. 该题要区分花色和大小分别统计数量

解题思路:

  1. 先用Set统计共有多少种花色,如果只有一种,表示有“五张相同花色的扑克牌”
  2. 用Map统计每种大小的扑克牌共有几张
    • 如果rankMap.size为5,表示有“五张大小互不相同的扑克牌”
    • 如果rankMap中有牌的数量大于等于3,即为“三条”
    • 如果rankMap有牌的数量等于2,即为“对子”
/**
 * @param {number[]} ranks
 * @param {character[]} suits
 * @return {string}
 */
var bestHand = function (ranks, suits) {
  // 使用Set统计有多少种花色
  let suitSet = new Set()

  for (const suit of suits) {
    suitSet.add(suit)
  }

  // 如果只有一种花色,表示同种花色有5张
  if (suitSet.size === 1) {
    return 'Flush'
  }

  // 使用Map统计每种大小牌的数量
  let rankMap = new Map()

  for (const rank of ranks) {
    rankMap.set(rank, (rankMap.get(rank) ?? 0) + 1)
  }

  // 如果有五种大小,表示有五张大小互不相同的扑克牌
  if (rankMap.size === 5) {
    return 'High Card'
  }

  // 查看不同大小的牌都有几张
  for (const count of rankMap.values()) {
    // 大等于3张都为“三条”
    if (count >= 3) {
      return 'Three of a Kind'
    }
  }

  // 剩下的只有“对子”一种可能
  return 'Pair'
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions