• 平地惊雷,GPT-4o 凌晨震撼发布


    GPT-4o

    今日凌晨,OpenAI 2024 年春季发布会召开,OpenAI 通过短短 28 分钟的发布会,发布了「再次震惊世界」的 GPT-4o,其中 o 是指 omni(全能)的意思。

    一款「全新交互(支持 文本/音频/视频 组合作为输入输出)」的、「快速(响应速度为 GTP-4 Turbo 的 2倍)」的、「能感受人类情感」的、「免费」的模型。

    为什么是今天?

    因为明天(5 月 15 号)就是 Google 的 I/0 大会,网传 Google 打算在会上公布大模型的最新进展:以 Gemini 为基础,名为 Pixie 的个人助手。

    这下好了,Google 的关注度必然下降。

    其实 OpenAI 对 Google 的狙击,不是第一次发生了。

    早在 2023 年 12 月,谷歌计划上线 Gemini 时,OpenAI 便在 11 月抢先举办了首届开发者大会。

    有过"被狙击"经验的 Google 这次没有光愣着,抓紧在官号中放出 Demo 的实时演示视频:

    alt

    但和 GPT-4o 相比,估计够呛,正如该帖子下的一位外国网友的留言:

    Sorry Google but we got it one day earlier(对不起谷歌,但我们一天前已经得到这个了)

    更加值得期待的是,在该发布会的前一天,Apple 和 OpenAI 的合作已宣布达成。

    虽然合作方式尚未公布,但大概率发生的事应该是:OpenAI 的技术将会在这一次的苹果新品中集中亮相。

    现在我们可以一同期待,这位像个真实人类一样,可以被随意打断,可以通过语气猜测用户情绪,支持端到端运行,使用体验和功能都无比强大的 GPT-4o 成为我们的新 Siri 了。

    我不想再强调有多少技术或者岗位会被革命,千言万语的描述汇聚成一个单词:her。

    alt

    这也是 OpenAI 创始人、CEO 山姆·奥特曼在发布会后,发的帖子内容。

    意在致敬在 2014 年获得奥斯卡最佳原创剧本的电影《Her》,由 斯派克·琼斯 执导和编剧的科幻爱情电影,讲述了一个孤独的男人和一个人工智能操作系统之间的不寻常的恋情。

    ...

    回归主线。

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

    题目描述

    平台:LeetCode

    题号:754

    在一根无限长的数轴上,你站在 0 的位置。终点在 target 的位置。

    你可以做一些数量的移动 numMoves :

    • 每次你可以选择向左或向右移动。
    • i 次移动(从   i == 1 开始,到  i == numMoves),在选择的方向上走 i 步。

    给定整数 target,返回 到达目标所需的 最小 移动次数(即最小 numMoves ) 。

    示例 1:

    输入: target = 2

    输出: 3

    解释:
    第一次移动,从 0 到 1 。
    第二次移动,从 1 到 -1 。
    第三次移动,从 -1 到 2 。

    示例 2:

    输入: target = 3

    输出: 2

    解释:
    第一次移动,从 0 到 1 。
    第二次移动,从 1 到 3 。

    提示:

    数学

    提示一:数轴上的任意点都以起点( 点)对称,只需要考虑对称点的任意一边

    由于题目没有限制我们「不能到达哪些点」以及「出发的起始方向」,因此以起点为中心的左右两边对称。

    即:左边所能到达任意一个点,都能通过调整所达路径的方向来将终点调整到右边。

    同时由于起点是一个特殊的位置 点,因此相应的「正数点」和「负数点」对称,我们仅需考虑一边(例如正数域)即可。

    提示二:先往靠近 target 的方向移动,到达或越过 target 的时候则停止

    只考虑 target 为正的情况,我们假定起始先往靠近 target 的方向移动(即所有步数均为正值),根据是「到达」还是「越过」target 位置分情况讨论:

    • 若能直接到达 target,此时消耗的必然是最小步数,可直接返回;
    • 若越过了 target,假设此时消耗的步数为 ,所走的距离为 ,我们可以考虑是否需要增加额外步数来到达 target
    提示三:越过 target 时,如何不引入额外步数

    若不引入额外步数,意味着我们需要将此前某些移动的方向进行翻转,使得调整后的

    我们假设需要调整的步数总和为 tot,则有 ,变形可得

    若想满足上述性质,需要确保能找到这样的 tot,即 tot 合法,

    不难推导出当 disttarget 差值为「偶数」时(两者奇偶性相同),我们可以找到这样的 tot,从而实现不引入额外步数来到达 target 位置。

    由于我们的 是由数列 累加而来,因此必然能够在该数列 中通过「不重复选择某些数」来凑成任意一个小于等于 的数。

    提示四:越过 target 时,如何尽量减少引入额外步数

    disttarget 差值不为「偶数」时,我们只能通过引入额外步数(继续往右走)来使得,两者差值为偶数。

    可以证明,最多引入步数不超过 步,可使用得两者奇偶性相同,即不超过 步可以覆盖到「奇数」和「偶数」两种情况。

    根据 的余数关系分情况讨论:

    • 余数为 ,即 ,由于 ,其中一数为偶数, 为偶数;
    • 余数为 ,即 ,由于 ,两个奇数相乘为奇数, 为奇数;
    • 余数为 ,即 ,两个奇数相乘为奇数, 为奇数;
    • 余数为 ,即 ,其中一数为偶数, 为偶数。

    因此在越过 target 后,最多引入不超过 步可使得 disttarget 奇偶性相同。

    提示五:如何不通过「遍历」或「二分」的方式找到一个合适的 k 值,再通过不超过 步的调整找到答案

    我们期望找到一个合适的 k 值,使得 ,随后通过增加 k 值来找到答案。

    利用求和公式 ,我们可以设定 为起始值,随后逐步增大 k 值,直到满足「disttarget 奇偶性相同」。

    Java 代码:

    class Solution {
        public int reachNumber(int target) {
            if (target < 0) target = -target;
            int k = (int) Math.sqrt(2 * target), dist = k * (k + 1) / 2;
            while (dist < target || (dist - target) % 2 == 1) {
                k++;
                dist = k * (k + 1) / 2;
            }
            return k;
        }
    }

    C++ 代码:

    class Solution {
    public:
        int reachNumber(int target) {
            if (target < 0) target = -target;
            int k = static_cast<int>(std::sqrt(2 * target));
            int dist = k * (k + 1) / 2;
            while (dist < target || (dist - target) % 2 == 1) {
                k++;
                dist = k * (k + 1) / 2;
            }
            return k;
        }
    };

    Python 代码:

    class Solution:
        def reachNumber(self, target: int) -> int:
            if target < 0:
                target = -target
            k = int(math.sqrt(2 * target))
            dist = k * (k + 1) / 2
            while dist < target or (dist - target) % 2 == 1:
                k += 1
                dist = k * (k + 1) / 2
            return k

    TypeScript 代码:

    function reachNumber(target: number): number {
        if (target < 0) target = -target
        let k = Math.floor(Math.sqrt(2 * target)), dist = k * (k + 1) / 2
        while (dist < target || (dist - target) % 2 == 1) {
            k++
            dist = k * (k + 1) / 2
        }
        return k
    }
    • 时间复杂度:
    • 空间复杂度:

    最后

    给大伙通知一下 📢 :

    全网最低价 LeetCode 会员目前仍可用 ~

    📅 年度会员:有效期加赠两个月!!; 季度会员:有效期加赠两周!!

    🧧 年度会员:获 66.66 现金红包!!; 季度会员:获 22.22 现金红包!!

    🎁 年度会员:参与当月丰厚专属实物抽奖(中奖率 > 30%)!!

    专属链接:leetcode.cn/premium/?promoChannel=acoier

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

    欢迎关注,明天见。

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

  • 相关阅读:
    The O-one:开源语言模型计算机的革命
    Mybatis-plus
    Spring如何使用环境变量控制配置文件加载呢?
    Python之字符串常用操作
    vSphere 架构设计方案(上)
    细说spring IOC三种开发模式
    IO流(二)
    【Spring Cloud Alibaba】seata分布式事务官方入门案例(实战版)
    FreeRTOS中的内存分配策略
    【Pandas总结】第二节 Pandas 的数据读取_pd.read_csv()的使用详解(非常全面,推荐收藏)
  • 原文地址:https://blog.csdn.net/weixin_33243821/article/details/138853280