阿里"大团圆"
近日,阿里集团打通了"内网权限",各个 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) == 0) continue;
for (int i = 0; i < m; i++) {
int cnt = map.getOrDefault(t + i, 0);
if (cnt == 0) return false;
map.put(t + i, cnt - 1);
}
}
return true;
}
}
C++ 代码:
class Solution {
public:
bool isNStraightHand(vector<int>& hand, int m) {
unordered_map<int, int> count;
priority_queue<int, vector<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] == 0) continue;
for (int i = 0; i < m; i++) {
if (count.find(t + i) == count.end() || count[t + i] == 0) return 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 多平台发布
6万+

被折叠的 条评论
为什么被折叠?



