删除排序数组中的重复项

简介: 删除排序数组中的重复项给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。

删除排序数组中的重复项

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。


将最终结果插入 nums 的前 k 个位置后返回 k 。


不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。


判题标准:


系统会用下面的代码来测试你的题解:

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案
int k = removeDuplicates(nums); // 调用
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有断言都通过,那么您的题解将被 通过。


示例 1:


输入:nums = [1,1,2]


输出:2, nums = [1,2,_]


解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。


示例 2:


输入:nums = [0,0,1,1,1,2,2,3,3,4]

输出:5, nums = [0,1,2,3,4]

解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。


提示:


1 <= nums.length <= 3 * 104

-104 <= nums[i] <= 104

nums 已按 升序 排列

一,暴力(时间复杂度O(n^2), 空间复杂度 O(1))

class Solution {
    public int removeDuplicates(int[] nums) {
    if(nums.length <=1) {
        return nums.length;
    }
    int pre=nums[0];
    int k=nums.length;
    for(int i=1;i<k;i++)
    {
        if(pre==nums[i])
        {
            for(int j=i;j<k;j++)
            {
                nums[j-1]=nums[j];
            }
            k--;
            i--;
        }
        else
        {
            pre=nums[i];
        }
    }
    return k;
    }
}

510bea7554ea47d0a69c3faa9608fdb0.png

二,优化(时间复杂度O(n),空间复杂度O(1))

class Solution {
    public int removeDuplicates(int[] nums) {
    if(nums.length <=1) {
        return nums.length;
    }
    int j=0;
    for(int i=1;i<nums.length;i++)
    {
        if(nums[j]!=nums[i]){
            nums[++j]=nums[i];
        }
    }
    return j+1;
    }
}

223e3b2fc1064f04808f2586be8e99b0.png

相关文章
|
存储 数据管理 物联网
深入解析数据仓库与数据湖:建构智能决策的桥梁
在当今信息时代,数据成为企业决策与创新的关键资源。本文将深入探讨数据仓库与数据湖的概念与应用,介绍其在数据管理和分析中的作用,以及如何构建智能决策的桥梁。
|
存储 开发框架 前端开发
探索移动应用开发之旅:从新手到专家
【9月更文挑战第16天】 在这篇文章中,我们将一起踏上一场激动人心的旅程,穿越移动应用开发的迷宫。无论你是刚刚起步的新手,还是正在寻求提升技能的开发者,这里都有你需要的知识和技巧。我们不仅会探讨移动应用开发的基础知识,还会深入到高级概念和最佳实践。让我们一起解锁移动应用开发的奥秘,打造令人惊叹的应用体验。
|
敏捷开发 监控 数据可视化
敏捷开发:拥抱变化,持续交付价值的艺术(二)
敏捷开发:拥抱变化,持续交付价值的艺术(二)
|
存储 关系型数据库 数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 多对一和多对多
【6月更文挑战第7天】该文探讨数据模型,比较了“多对一”和“多对多”关系。通过使用ID而不是纯文本(如region_id代替&quot;Greater Seattle Area&quot;),可以实现统一、避免歧义、简化修改、支持本地化及优化搜索。在数据库设计中,需权衡冗余和范式。文档型数据库适合一对多但处理多对多复杂,若无Join,需应用程序处理。关系型数据库则通过外键和JOIN处理这些关系。文章还提及文档模型与70年代层次模型的相似性,层次模型以树形结构限制了多对多关系处理。为克服层次模型局限,发展出了关系模型和网状模型。
182 6
|
机器学习/深度学习 人工智能 自然语言处理
未来AI技术发展的趋势与挑战
随着人工智能技术的快速发展,未来的AI将面临更多挑战与机遇。本文探讨了AI技术的当前状态以及可能的发展方向,分析了在各个领域中AI所面临的挑战,并展望了未来AI技术的潜力与发展趋势。 【7月更文挑战第1天】
710 0
每日一题(珠玑妙算,两数之和)
每日一题(珠玑妙算,两数之和)
176 1
|
Java 关系型数据库 MySQL
Shiro实战+springboot集成
Shiro实战+springboot集成
217 0
|
存储 数据处理 索引
大文本的全文检索方案附件索引
大文本的全文检索方案附件索引
287 0
|
Java 程序员 微服务
一套基于 SpringBoot 的完整高并发电商系统,拿去面试吧!
一套基于 SpringBoot 的完整高并发电商系统,拿去面试吧!
240 0
|
存储 运维 供应链
更高水准的供应链安全实践:Alibaba Dragonwell 及其 SLSA 2 级认证
日益庞大的Java应用,我们是否真的能切实保证应用的安全?
更高水准的供应链安全实践:Alibaba Dragonwell 及其 SLSA 2 级认证