安踏:并购实现全球化的里程碑时刻(含算法面试原题)

IPO,Buyout

既是开年最大的 IPO,更是一笔华丽的 Buyout。

北京时间2月1日晚,亚玛芬体育(Amer Sports)正式登陆纽交所。

本次亚玛芬体育共募得 13 亿美元(自2023年9月以来全球规模最大IPO),发行市值 63 亿美元(约合 450 亿人民币)。

说亚玛芬体育开年大家会感到陌生。

那始祖鸟呢?

还陌生的话,那安踏呢?

一句话介绍它们之间的关系:始祖鸟是亚玛芬体育旗下拥有三个核心品牌之一,而亚玛芬体育则于 2019 年由 安踏、方源资本、Chip Wilson 以及 腾讯财团 进行联合收购。

在收购过程中,安踏占绝对主导地位,当时亚玛芬体育每股作价 40 欧元,总收购价为 16 亿欧元(当时约合 371 亿人民币)。

其中安踏投资 15.43 亿欧元,占股 57.85%,方源资本持股 21.4%,Chip Wilson持股 20.65%,腾讯持股 5.63%。

更重要的是,2019 年的亚玛芬体育仍是一家面临亏损的公司,当中的始祖鸟也是作为阿迪达斯的被弃业务,被亚玛芬体育全资收购,从而进入亚玛芬体育。

而在被收购后的第二年 2020 年,亚玛芬体育就已经实现盈利(营收 24.46 亿美元,利润 1.25 亿美元),从 2020 到现在,营收仍逐年上升,在大中华的盈利占比更是节节攀升。

现在回头看,安踏的全球化道路无疑是成功的,而之所以能够成功,核心是运营能力。

安踏以并购作为开端,从以前的 FILA 到现在的亚玛芬体育。不仅扭亏为盈,更重要的完成了全人群+全赛道的覆盖,大大丰富产品线的同时,增强企业抗风险额能力。

...

回归主线。

来一道简单模拟题。

题目描述

平台:LeetCode

题号:2342

给你一个下标从 0 开始的数组 nums,数组中的元素都是正整数。

请你选出两个下标 iji != j),且 nums[i] 的数位和与 nums[j] 的数位和相等。

请你找出所有满足条件的下标 ij,找出并返回 nums[i] + nums[j] 可以得到的最大值。

示例 1:

ini 复制代码
输入:nums = [18,43,36,13,7]

输出:54

解释:满足条件的数对 (i, j) 为:
- (0, 2) ,两个数字的数位和都是 9 ,相加得到 18 + 36 = 54 。
- (1, 4) ,两个数字的数位和都是 7 ,相加得到 43 + 7 = 50 。
所以可以获得的最大和是 54 。

示例 2:

ini 复制代码
输入:nums = [10,12,19,14]

输出:-1

解释:不存在满足条件的数对,返回 -1 。

提示:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 </math>1<=nums.length<=105
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 < = n u m s [ i ] < = 1 0 9 1 <= nums[i] <= 10^9 </math>1<=nums[i]<=109

模拟

既然每个 <math xmlns="http://www.w3.org/1998/Math/MathML"> n u m s [ i ] nums[i] </math>nums[i] 都对应一个具体的数位和,统计每个数位和的最大值和次大值,然后在所有数位和的最大值和次大值求和中取 max 即是答案。

利用 <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 < = n u m s [ i ] < = 1 0 9 1 <= nums[i] <= 10^9 </math>1<=nums[i]<=109,我们知道数位和不会超过 <math xmlns="http://www.w3.org/1998/Math/MathML"> 9 × 9 = 81 9 \times 9 = 81 </math>9×9=81,可直接起一个大小为 <math xmlns="http://www.w3.org/1998/Math/MathML"> 100 × 2 100 \times 2 </math>100×2 的二维数组进行统计, <math xmlns="http://www.w3.org/1998/Math/MathML"> v a l [ x ] [ 0 ] val[x][0] </math>val[x][0] 代表数位和为 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x 的次大值, <math xmlns="http://www.w3.org/1998/Math/MathML"> v a l [ x ] [ 1 ] val[x][1] </math>val[x][1] 代表数位和为 <math xmlns="http://www.w3.org/1998/Math/MathML"> x x </math>x 的最大值。

Java 代码:

Java 复制代码
class Solution {
    public int maximumSum(int[] nums) {
        int[][] val = new int[100][2];
        for (int x : nums) {
            int t = x, cur = 0;
            while (t != 0) {
                cur += t % 10;
                t /= 10;
            }
            if (x >= val[cur][1]) { // 最大沦为次大, 更新最大
                val[cur][0] = val[cur][1];
                val[cur][1] = x;
            } else if (x > val[cur][0]) { // 更新次大
                val[cur][0] = x;
            }
        }
        int ans = -1;
        for (int i = 0; i < 100; i++) {
            if (val[i][0] != 0 && val[i][1] != 0) ans = Math.max(ans, val[i][0] + val[i][1]);
        }
        return ans;
    }
}

C++ 代码:

C++ 复制代码
class Solution {
public:
    int maximumSum(vector<int>& nums) {
        vector<vector<int>> val(100, vector<int>(2, 0));
        for (int x : nums) {
            int t = x, cur = 0;
            while (t != 0) {
                cur += t % 10;
                t /= 10;
            }
            if (x >= val[cur][1]) {
                val[cur][0] = val[cur][1];
                val[cur][1] = x;
            } else if (x > val[cur][0]) {
                val[cur][0] = x;
            }
        }
        int ans = -1;
        for (int i = 0; i < 100; i++) {
            if (val[i][0] != 0 && val[i][1] != 0) ans = max(ans, val[i][0] + val[i][1]);
        }
        return ans;
    }
};

Python 代码:

Python 复制代码
class Solution:
    def maximumSum(self, nums: List[int]) -> int:
        val = [[0, 0] for _ in range(100)]
        for x in nums:
            t, cur = x, 0
            while t != 0:
                cur += t % 10
                t //= 10
            if x >= val[cur][1]:
                val[cur][0], val[cur][1] = val[cur][1], x
            elif x > val[cur][0]:
                val[cur][0] = x
        ans = -1
        for i in range(100):
            if val[i][0] != 0 and val[i][1] != 0:
                ans = max(ans, val[i][0] + val[i][1])
        return ans

TypeScript 代码:

TypeScript 复制代码
function maximumSum(nums: number[]): number {
    const val = Array.from({ length: 100 }, () => [0, 0]);
    for (const x of nums) {
        let t = x, cur = 0;
        while (t !== 0) {
            cur += t % 10;
            t = Math.floor(t / 10);
        }
        if (x >= val[cur][1]) {
            val[cur][0] = val[cur][1];
            val[cur][1] = x;
        } else if (x > val[cur][0]) {
            val[cur][0] = x;
        }
    }
    let ans = -1;
    for (let i = 0; i < 100; i++) {
        if (val[i][0] !== 0 && val[i][1] !== 0) ans = Math.max(ans, val[i][0] + val[i][1]);
    }
    return ans;
};
  • 时间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n log ⁡ m ) O(n\log{m}) </math>O(nlogm),其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> n = 1 e 5 n=1e5 </math>n=1e5 为 nums 长度, <math xmlns="http://www.w3.org/1998/Math/MathML"> m = 1 e 9 m=1e9 </math>m=1e9 为 <math xmlns="http://www.w3.org/1998/Math/MathML"> n u m s [ i ] nums[i] </math>nums[i] 值域上界
  • 空间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( C ) O(C) </math>O(C),其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> C = 2 × 9 × log ⁡ m C = 2 \times 9 \times \log{m} </math>C=2×9×logm

模拟

更进一步,我们不需要记录次大值,仅记录某个"数对和"当前的最大值即可。

每次计算出当前 <math xmlns="http://www.w3.org/1998/Math/MathML"> n u m s [ i ] nums[i] </math>nums[i] 对应的数对 cur 后,检查 cur 是否已出现过,若出现过用两者之和更新答案,并用 <math xmlns="http://www.w3.org/1998/Math/MathML"> n u m s [ i ] nums[i] </math>nums[i] 来更新 cur 下的最大值。

该做法本质是用「遍历过程」代替「次大维护」。

Java 代码:

Java 复制代码
class Solution {
    public int maximumSum(int[] nums) {
        int[] val = new int[100];
        int ans = -1;
        for (int x : nums) {
            int t = x, cur = 0;
            while (t != 0) {
                cur += t % 10;
                t /= 10;
            }
            if (val[cur] != 0) ans = Math.max(ans, val[cur] + x);
            val[cur] = Math.max(val[cur], x);
        }
        return ans;       
    }
}

C++ 代码:

C++ 复制代码
class Solution {
public:
    int maximumSum(vector<int>& nums) {
        vector<int> val(100, 0);
        int ans = -1;
        for (int x : nums) {
            int t = x, cur = 0;
            while (t != 0) {
                cur += t % 10;
                t /= 10;
            }
            if (val[cur] != 0) ans = max(ans, val[cur] + x);
            val[cur] = max(val[cur], x);
        }
        return ans;
    }
};

Python 代码:

Python 复制代码
class Solution:
    def maximumSum(self, nums: List[int]) -> int:
        val = [0] * 100
        ans = -1
        for x in nums:
            t, cur = x, 0
            while t != 0:
                cur += t % 10
                t //= 10
            if val[cur] != 0:
                ans = max(ans, val[cur] + x)
            val[cur] = max(val[cur], x)
        return ans

TypeScript 代码:

TypeScript 复制代码
function maximumSum(nums: number[]): number {
    const val = Array(100).fill(0);
    let ans = -1;
    for (const x of nums) {
        let t = x, cur = 0;
        while (t !== 0) {
            cur += t % 10;
            t = Math.floor(t / 10);
        }
        if (val[cur] !== 0) ans = Math.max(ans, val[cur] + x);
        val[cur] = Math.max(val[cur], x);
    }
    return ans;
};
  • 时间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n log ⁡ m ) O(n\log{m}) </math>O(nlogm),其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> n = 1 e 5 n=1e5 </math>n=1e5 为 nums 长度, <math xmlns="http://www.w3.org/1998/Math/MathML"> m = 1 e 9 m=1e9 </math>m=1e9 为 <math xmlns="http://www.w3.org/1998/Math/MathML"> n u m s [ i ] nums[i] </math>nums[i] 值域上界
  • 空间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( C ) O(C) </math>O(C),其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> C = 9 × log ⁡ m C = 9 \times \log{m} </math>C=9×logm

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

欢迎关注,明天见。

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

相关推荐
阿珊和她的猫1 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
PAK向日葵3 小时前
【算法导论】PDD 0817笔试题题解
算法·面试
uzong5 小时前
技术故障复盘模版
后端
GetcharZp5 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
加班是不可能的,除非双倍日工资5 小时前
css预编译器实现星空背景图
前端·css·vue3
桦说编程6 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研6 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi6 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
gnip6 小时前
vite和webpack打包结构控制
前端·javascript
excel7 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端