好起来了,打破壁垒,阿里大团圆!

阿里"大团圆"

近日,阿里集团打通了"内网权限",各个 BU(菜鸟、钉钉、饿了么等等)的员工,重新在内网重聚了。

不少阿里员工纷纷发帖,纪念"重回"阿里的时刻,甚至不少人玩起了 MAGA 的梗(把特朗普的口号换成了 Make Alibaba Great Again)🤣🤣🤣

果然,对于阿里员工来说,相比于"菜鸟人"、"钉钉人",大家还是更喜欢"阿里人"的身份。

这对于阿里员工,确实是意义深远的时刻,自 2023 年 8 月,阿里发布全员信,宣布启动 "1+6+N"(“1”是阿里巴巴集团,“6”是阿里云智能、淘宝天猫商业、本地生活、国际数字商业、菜鸟、大文娱等阿里的六大板块业务;“N”为高鑫零售、银泰商业、阿里健康、盒马、夸克等其他重要业务)的组织变革之后,各个 BU 的壁垒开始建立。

如今,壁垒开始逐步被打破。

无论是前段时间的统一新工牌,还是现在的内网重聚,又或是未来(可能的)跨集团丝滑转岗(无须先离职再入职),都表明阿里巴巴要重回"大集团"模式。

重回大集团模式,不代表所有 BU 进行合并(这会带来效率下降问题),但取消一些不必要的壁垒,总是极好的。

结合近半年,阿里不断出售边缘资产,重新将资源聚焦到主营业务,以及马老师的高频露脸,阿里股票的价值重估,这家公司还真有"老树开花"的意思了。

对此,你怎么看?

...

回归主题。

来一道和「阿里巴巴」相关的算法题。

题目描述

平台:LeetCode

题号:846

Alice 手中有一把牌,她想要重新排列这些牌,分成若干组,使每一组的牌数都是 groupSize,并且由 groupSize 张连续的牌组成。

给你一个整数数组 hand 其中 hand[i] 是写在第 i 张牌,和一个整数 groupSize

如果她可能重新排列这些牌,返回 true ,否则,返回 false

示例 1:

输入:hand = [1,2,3,6,2,3,4,7,8], groupSize = 3

输出:true

解释:Alice 手中的牌可以被重新排列为 [1,2,3],[2,3,4],[6,7,8]。

示例 2:

输入:hand = [1,2,3,4,5], groupSize = 4

输出:false

解释:Alice 手中的牌无法被重新排列成几个大小为 4 的组。

提示:

模拟 + 哈希表 + 优先队列(堆)

为了方便,我们令

题目要求我们将 hand 分为若干份大小为 的顺子。

「在给定 hand 的情况下,划分方式唯一确定,因此本质上这是一个「模拟」的过程。」

具体的,我们可以使用「哈希表」对 hand 中的数值进行「出现次数」统计,并用于后续 「实时」 维护剩余元素的出现次数。

然后使用优先队列维护(小根堆)所有的 hand[i]。每次从优先队列(堆)中取出堆顶元素 「尝试作为」「顺子」的发起点/首个元素(当然 能够作为发起点的前提是 仍是剩余元素,即实时维护的出现次数不为 ),然后用 作为发起点/首个元素构造顺子,即对 元素的出现次数进行 操作。

若构造过程中没有出现「剩余元素出现次数」不足以 的话,说明整个构造过程没有冲突,返回 True,否则返回 False

Java 代码:

class Solution {
    public boolean isNStraightHand(int[] hand, int m) {
        Map<Integer, Integer> map = new HashMap<>();
        PriorityQueue<Integer> q = new PriorityQueue<>((a,b)->a-b);
        for (int i : hand) {
            map.put(i, map.getOrDefault(i, 0) + 1);
            q.add(i);
        }
        while (!q.isEmpty()) {
            int t = q.poll();
            if (map.get(t) == 0continue;
            for (int i = 0; i < m; i++) {
                int cnt = map.getOrDefault(t + i, 0);
                if (cnt == 0return false;
                map.put(t + i, cnt - 1);
            }
        }
        return true;
    }
}

C++ 代码:

class Solution {
public:
    bool isNStraightHand(vector<int>& hand, int m) {
        unordered_map<intint> count;
        priority_queue<intvector<int>, greater<int>> pq;
        for (int num : hand) {
            count[num]++;
            pq.push(num);
        }
        while (!pq.empty()) {
            int t = pq.top();
            pq.pop();
            if (count[t] == 0continue;
            for (int i = 0; i < m; i++) {
                if (count.find(t + i) == count.end() || count[t + i] == 0return false;
                count[t + i]--;
            }
        }
        return true;
    }
};

Python 代码:

class Solution:
    def isNStraightHand(self, hand: List[int], m: int) -> bool:
        count = defaultdict(int)
        for num in hand:
            count[num] += 1
        heapq.heapify(hand)
        while hand:
            t = heapq.heappop(hand)
            if count[t] == 0:
                continue
            for i in range(m):
                if count[t + i] <= 0:
                    return False
                count[t + i] -= 1
        return True
  • 时间复杂度:令 为数组 hand 长度,使用哈希表进行次数统计的复杂度为 ;将所有元素从堆中存入和取出的复杂度为 。整体复杂度为
  • 空间复杂度:

最后

巨划算的 LeetCode 会员优惠通道目前仍可用 ~

使用福利优惠通道 leetcode.cn/premium/?promoChannel=acoier,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。

我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻

欢迎关注,明天见。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

本文由 mdnice 多平台发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值