【LeetCode】846. Hand of Straights 解题报告(Python & C+)

901 篇文章 196 订阅

作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/hand-of-straights/description/

题目描述

Alice has a hand of cards, given as an array of integers.

Now she wants to rearrange the cards into groups so that each group is size W, and consists of W consecutive cards.

Return true if and only if she can.

Example 1:

Input: hand = [1,2,3,6,2,3,4,7,8], W = 3
Output: true
Explanation: Alice's hand can be rearranged as [1,2,3],[2,3,4],[6,7,8].

Example 2:

Input: hand = [1,2,3,4,5], W = 4
Output: false
Explanation: Alice's hand can't be rearranged into groups of 4.

Note:

  1. 1 <= hand.length <= 10000
  2. 0 <= hand[i] <= 10^9
  3. 1 <= W <= hand.length

题目大意

给出了一堆扑克牌,也给出了一个数字W,看这堆扑克牌能不能恰好全部拼成长度为W的顺子。

解题方法

这个思路可以说很暴力了。先做个统计,得出手里都有哪些牌,然后找出最小的牌,从这个牌开始长度为W的遍历,判断能否构成长度为W的顺子,就这样求下去即可,直到所有的牌都结束。

做了一个优化的地方,找出最小的牌的个数,因为这个最小的牌只能和比它大的牌构成顺子,所以我们可以在遍历的时候把后面的牌的个数全部剪掉这个数字。

代码如下:

class Solution(object):
    def isNStraightHand(self, hand, W):
        """
        :type hand: List[int]
        :type W: int
        :rtype: bool
        """
        cards = collections.Counter(hand)
        while cards:
            start = min(cards.keys()) 
            start_val = cards[start]
            for card in range(start, start + W):
                if card not in cards:
                    return False
                cards[card] -= start_val
                if cards[card] == 0:
                    cards.pop(card)
                elif cards[card] < 0:
                    return False
        return not cards

同样的做法,如果提前做一个排序还是能加快这个运算的,这样就不用每次都去求min了。里面用到的一个技巧是range(W)之后做了一个翻转,也就是说先从大的值开始减,这样能保证cards[start]不受干扰。

class Solution(object):
    def isNStraightHand(self, hand, W):
        """
        :type hand: List[int]
        :type W: int
        :rtype: bool
        """
        cards = collections.Counter(hand)
        for start in sorted(cards):
            if cards[start] > 0:
                for j in range(W)[::-1]:
                    if start + j not in cards:
                        return False
                    cards[start + j] -= cards[start]
                    if cards[start + j] < 0:
                        return False
        return True

用C++刷题的时候,使用Map保存每个数字的数量,因为map是自动排好序的。所以少了排序的步骤。统计个数之后,直接进行遍历,对于每个数字都向他后面搜索W - 1个数字。方法比较直白。

class Solution {
public:
    bool isNStraightHand(vector<int>& hand, int W) {
        map<int, int> count;
        for (int h : hand) {
            ++count[h];
        }
        for (auto c : count) {
            int cur = c.first;
            int n = c.second;
            if (n > 0) {
                for (int i = 1; i < W; ++i) {
                    if (!count.count(cur + i)) {
                        return false;
                    }
                    count[cur + i] -= n;
                    if (count[cur + i] < 0)
                        return false;
                }
            }
        }
        return true;
    }
};

日期

2018 年 9 月 8 日 —— 美好的周末,从刷题开始
2019 年 2 月 27 日 —— 二月就要完了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于LeetCode上的问题994.腐烂的橘子,你可以使用Python来解决。下面是一个示例代码: ```python from collections import deque def orangesRotting(grid): # 记录网格的行数和列数 row, col = len(grid), len(grid[0]) # 定义四个方向:上、下、左、右 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 使用队列来保存腐烂的橘子的位置 queue = deque() # 记录新鲜橘子的数量 fresh_count = 0 # 遍历整个网格,初始化队列和新鲜橘子的数量 for i in range(row): for j in range(col): if grid[i][j] == 2: # 腐烂的橘子 queue.append((i, j)) elif grid[i][j] == 1: # 新鲜橘子 fresh_count += 1 # 如果新鲜橘子的数量为0,直接返回0 if fresh_count == 0: return 0 # 初始化分钟数 minutes = 0 # 开始进行BFS,直到队列为空 while queue: # 记录当前分钟数下,队列中的元素数量 size = len(queue) # 遍历当前分钟数下的所有腐烂的橘子 for _ in range(size): x, y = queue.popleft() # 遍历四个方向 for dx, dy in directions: nx, ny = x + dx, y + dy # 判断新位置是否在网格内,并且是新鲜橘子 if 0 <= nx < row and 0 <= ny < col and grid[nx][ny] == 1: # 将新鲜橘子变为腐烂状态 grid[nx][ny] = 2 # 将新鲜橘子的位置加入队列 queue.append((nx, ny)) # 新鲜橘子的数量减1 fresh_count -= 1 # 如果当前分钟数下,没有新鲜橘子了,结束循环 if fresh_count == 0: break # 每遍历完一层,分钟数加1 minutes += 1 # 如果最后还有新鲜橘子,返回-1,否则返回分钟数 return -1 if fresh_count > 0 else minutes ``` 你可以将给定的网格作为参数传递给`orangesRotting`函数来测试它。请注意,该代码使用了BFS算法来遍历橘子,并计算腐烂的分钟数。希望能对你有所帮助!如果有任何疑问,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值