Java C++题解leetcode消失的两个数字实例

 更新时间:2022年09月29日 14:51:02   作者:AnjaVon  
这篇文章主要介绍了Java C++题解leetcode消失的两个数字实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目要求

思路:数学推导

  • 不重复的数组序列可以根据高斯公式计算所有元素的总和:
    • 用当前数组长度加上两个缺失的数字可以得到所有数字长度,即可应用公式。
  • 减去当前数组和即可得到缺失数字和sumsumsum;
  • 两个缺失的数字分别位于m=sum2m=\frac{sum}{2}m=2sum两边:
    • 遍历当前数组中所有小于(或大于)mmm的值,找到缺失的一个;
      • 同样利用两个“和”的差值得到;
    • 利用sumsumsum即可得到另一个。

Java

class Solution {
    public int[] missingTwo(int[] nums) {
        int len = nums.length + 2;
        int tot = len * (1 + len) / 2;
        for (int x : nums)
            tot -= x;
        int sum = tot, m = tot / 2;
        tot = m * (1 + m) / 2;
        for (int x : nums) {
            if (x <= m) // m向下取整,可能相等
                tot -= x;
        }
        return new int[]{tot, sum - tot};
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

C++

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int len = nums.size() + 2;
        int tot = len * (1 + len) / 2;
        for (int x : nums)
            tot -= x;
        int sum = tot, m = tot / 2;
        tot = m * (1 + m) / 2;
        for (int x : nums) {
            if (x <= m) // m向下取整,可能相等
                tot -= x;
        }
        return {tot, sum - tot};
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

Rust

impl Solution {
    pub fn missing_two(nums: Vec<i32>) -> Vec<i32> {
        let len = nums.len() as i32 + 2;
        let mut sum : i32 = nums.iter().sum();
        sum = len * (1 + len) / 2 - sum;
        let m = sum / 2; // m向下取整,可能相等
        let mut lsum : i32 = nums.iter().filter(|&x| x <= &m).sum();
        lsum = m * (1 + m) / 2 - lsum;
        vec![lsum, sum - lsum]
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

总结

奇妙的难度标记机制之顶多标个中等吧……没有看到时空复杂度的时候第一反应是排序检查标记,被这个思路圈了一会才反应过来数组是无序的,那都无序不重复了就很容易想到用元素和来回减。

以上就是Java C++题解leetcode消失的两个数字实例的详细内容,更多关于Java C++题解消失的两个数字的资料请关注脚本之家其它相关文章!

相关文章

  • 如何手动安装Gradle并配置IDEA使用Gradle构建

    如何手动安装Gradle并配置IDEA使用Gradle构建

    本文给大家分享手动安装Gradle并配置IDEA使用Gradle构建的步骤,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-04-04
  • 详解Java中ThreadLocal类型及简单用法

    详解Java中ThreadLocal类型及简单用法

    ThreadLocal实例通常是希望将状态与线程关联起来的类中的私有静态字段,下面通过例子给大家详细介绍Java中ThreadLocal类型及简单用法,感兴趣的朋友跟随小编一起看看吧
    2021-10-10
  • Java Spring Boot消息服务万字详解分析

    Java Spring Boot消息服务万字详解分析

    在实际项目开发中,有时需要与其他系统进行集成完成相关业务功能,这种情况最原始做法是程序内部相互调用,除此之外,还可以用消息服务中间件进行业务处理,用消息服务中间件处理业务能够提升系统的异步通信和扩展解耦能力。Spring Boot对消息服务管理提供了非常好的支持
    2021-10-10
  • java文字转语音的实现示例

    java文字转语音的实现示例

    在Java中,我们可以使用第三方库来实现文字转语音的功能,本文主要介绍了java文字转语音的实现示例,选择jacob技术实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 一文详解SpringBoot如何优雅地实现异步调用

    一文详解SpringBoot如何优雅地实现异步调用

    SpringBoot想必大家都用过,但是大家平时使用发布的接口大都是同步的,那么你知道如何优雅的实现异步呢?这篇文章就来和大家详细聊聊
    2023-03-03
  • Spring Boot中使用Redis和Lua脚本实现延时队列的方案

    Spring Boot中使用Redis和Lua脚本实现延时队列的方案

    通过使用Redis和Lua脚本,可以在Spring Boot环境中实现一个高效且可靠的延时队列系统,这种方法利用了Redis的有序集合数据结构和Lua脚本的原子性操作来确保任务的正确性和一致性,这篇文章主要介绍了Spring Boot中使用Redis和Lua脚本实现延时队列,需要的朋友可以参考下
    2024-05-05
  • Java中的Gradle与Groovy的区别及存在的关系

    Java中的Gradle与Groovy的区别及存在的关系

    这篇文章主要介绍了Java中的Gradle与Groovy的区别及存在的关系,Groovy是一种JVM语言,它可以编译为与Java相同的字节码,并且可以与Java类无缝地互操作,Gradle是Java项目中主要的构建系统之一,下文关于两者的详细内容,需要的小伙伴可以参考一下
    2022-02-02
  • JAVA 获取系统当前时间实例代码

    JAVA 获取系统当前时间实例代码

    这篇文章主要介绍了JAVA 获取系统当前时间实例代码的相关资料,需要的朋友可以参考下
    2016-10-10
  • SpringMVC修改返回值类型后的消息转换器处理方式

    SpringMVC修改返回值类型后的消息转换器处理方式

    这篇文章主要介绍了SpringMVC修改返回值类型后的消息转换器处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • idea显示springboot多服务启动界面service操作

    idea显示springboot多服务启动界面service操作

    这篇文章主要介绍了idea显示springboot多服务启动界面service操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论