摇人!今年我们新招16000+人

摇人,明天开始

7 月 26 日,京东总部 1 号园区 DEF 座启用,新的现代化职场园区"蓝方方 Plus"正式组成。

alt

更加值得关注的是,借此机会,京东 2025 校园招聘将于 8 月 1 日全面启动,累积提供 10000+ 就业岗位和 6000+ 实习岗位,并提供极具竞争力的条件。

alt

往年京东的校园招聘,大多都是在 8 月底开始,这次提前了近一个月,同时放出的 HC 增长也成百上千。

话说今年传统电商"阿里"和"京东"又走出了截然不同的路线,阿里换帅后不断砍掉一些非主营核心业务,马老师也依然是"半隐身"状态;京东则是多次被爆出刘强东经常半夜微信群安排工作,试图不断拓展新边界。

但无论如何,当下就业环境恶劣,七八月还时常出现企业毁应届的局面,多个机会总是好的,希望会有越来越多的互联网公司和京东一样,重回到招聘市场的上升通道。

...

回归主线。

来一道和「京东」相关的算法题。

题目描述

平台:LeetCode

题号:1423

几张卡牌排成一行,每张卡牌都有一个对应的点数,点数由整数数组 cardPoints 给出。

每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。

你的点数就是你拿到手中的所有卡牌的点数之和。

给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。

示例 1:

输入:cardPoints = [1,2,3,4,5,6,1], k = 3

输出:12

解释:第一次行动,不管拿哪张牌,你的点数总是 1 。但是,先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌,最终点数为 1 + 6 + 5 = 12 。

示例 2:

输入:cardPoints = [2,2,2], k = 2

输出:4

解释:无论你拿起哪两张卡牌,可获得的点数总是 4 。

示例 3:

输入:cardPoints = [9,7,7,9,7,7,9], k = 7

输出:55

解释:你必须拿起所有卡牌,可以获得的点数为所有卡牌的点数之和。

示例 4:

输入:cardPoints = [1,1000,1], k = 1

输出:1

解释:你无法拿到中间那张卡牌,所以可以获得的最大点数为 1 。 

示例 5:

输入:cardPoints = [1,79,80,1,1,1,200,1], k = 3

输出:202

提示:

滑动窗口

从两边选卡片,选 k 张,卡片总数量为 n 张,即有 n - k 张不被选择。

所有卡片总和 sum 固定,要使选择的 k 张的总和最大,反过来就是要让不被选择的 n - k 张总和最小。

原问题等价为:「从 cardPoints 中找长度为 n - k 的连续段,使其总和最小。」

具体的,用变量 sum 代指 cardPoints 总和,cur 代表长度固定为 n - k 的当前窗口总和,minv 代表所有长度为 n - k 的窗口中总和最小的值。

起始先将滑动窗口压满,取得第一个滑动窗口的目标值 cur(同时更新为 minv),随后往后继续处理 cardPoints,每往前滑动一位,需要删除一个和添加一个元素,并不断更新 minv,最终 sum - minv 即是答案。

Java 代码:

class Solution {
    public int maxScore(int[] cardPoints, int k) {
        int n = cardPoints.length, len = n - k;
        int sum = 0, cur = 0;
        for (int i = 0; i < n; i++) sum += cardPoints[i];
        for (int i = 0; i < len; i++) cur += cardPoints[i]; 
        int minv = cur;
        for (int i = len; i < n; i++) { 
            cur = cur + cardPoints[i] - cardPoints[i - len]; 
            minv = Math.min(minv, cur);
        }
        return sum - minv;
    }
}

C++ 代码:

class Solution {
public:
    int maxScore(vector<int>& cardPoints, int k) {
        int n = cardPoints.size(), len = n - k;
        int sum = 0, cur = 0;
        for (int i = 0; i < n; i++) sum += cardPoints[i];
        for (int i = 0; i < len; i++) cur += cardPoints[i]; 
        int minv = cur;
        for (int i = len; i < n; i++) { 
            cur = cur + cardPoints[i] - cardPoints[i - len]; 
            minv = min(minv, cur);
        }
        return sum - minv;
    }
};

Python 代码:

class Solution:
    def maxScore(self, cardPoints: List[int], k: int) -> int:
        n, m = len(cardPoints), len(cardPoints) - k
        total, cur = sum(cardPoints), sum(cardPoints[:m])
        minv = cur
        for i in range(m, n):
            cur = cur + cardPoints[i] - cardPoints[i - m]
            minv = min(minv, cur)
        return total - minv

TypeScript 代码:

function maxScore(cardPoints: number[], k: number): number {
    const n = cardPoints.length, m = n - k;
    let tot = 0, cur = 0;
    for (let i = 0; i < n; i++) tot += cardPoints[i];
    for (let i = 0; i < m; i++) cur += cardPoints[i];
    let minv = cur;
    for (let i = m; i < n; i++) {
        cur = cur + cardPoints[i] - cardPoints[i - m];
        minv = Math.min(minv, cur);
    }
    return tot - minv;
};
  • 时间复杂度:每个元素最多滑入和滑出窗口一次,复杂度为
  • 空间复杂度:

最后

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

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

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

欢迎关注,明天见。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值