顺序表刷题(1~3)

news2024/11/27 8:30:05

目录

 移除元素

删除有序数组重复项 

合并有序数组


 

 移除元素

 方法一:


如果找到一个删除一个这样的时间复杂度为O(n^2)(最坏删除所有数据)删除后还要挪动数据。我们可以将符合条件的数组元素放入一个临时数组中,这种方法的时间复杂度为O(n),空间复杂度为O(n)

 

 方法二:

我们可以采用双指针的方式来解决这道题。一个指针遇到删除的数据时往后走,直到出现不需要删除的数据,然后给另一个指针赋值,完成这部操作后两者同时移动。时间复杂O(n),空间复杂度O(1)

 

int removeElement(int* nums, int numsSize, int val){

int dst=0,src = 0;
while(src<numsSize)
{
    if(nums[src]==val)
    {
        src++;
    }
    else
    {
        nums[dst] = nums[src];
        dst++;
        src++;
    }
}
return dst;
}

 因为不需要考虑超出新长度后面的数组,所以我们只需返回它的长度-1个元素,即dst个元素。

 简化代码:

int removeElement(int* nums, int numsSize, int val){

int dst=0,src = 0;
while(src<numsSize)
{
    if(nums[src]!=val)
        {
            nums[dst++] = nums[src];
        }
    src++;
}
return dst;
}

删除有序数组重复项 

这道题有几处关键的地方:升序,原地,只出现一次,相对顺序。

这就决定了这道题用双指针会非常好做,我们可以比较两个下标的值是否相同,因为是升序排列,所以不用担心后面会重复出现之前比较过的数据。

int removeDuplicates(int* nums, int numsSize){
    int dst=0,src=0;
    while(src<numsSize)
    {
        if(nums[src]==nums[dst])
        {
            src++;
        }
        else 
        nums[++dst] = nums[src++];
    }
    return dst+1;
}

需要注意,这里是删除重复项,如果两者不同,则需先将后指针先+1再进行赋值。这就导致了返回的时候需要返回当前数组的长度,即dst+1个数据。

合并有序数组

 这道题一般可以对两个数组下标进行遍历比较,取小的一个进行尾插到nums1中,但在这里有一个测试用例可能会出错。

 如果碰到后面的不是有效数据的0就会被覆盖,不满足非递减的要求。所以我们采取从后往前,比较大的进行插入。

存在两种情况:nums1走到尽头或nums2走到尽头,nums2走到尽头时此时nums1的数据就是新的数组,如果nums1走到尽头时还需将剩余的数据拷贝到nums1里。

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int i1 = m-1,i2 = n-1;
    int j= i1 + i2 + 1;//注意下标要加一
    while(i1>=0 && i2>=0)
    {
        if(nums1[i1] > nums2[i2])
        {
            nums1[j--] = nums1[i1--];
        }
        else
        nums1[j--] = nums2[i2--];
    }
    while(i2>=0)
    {
        nums1[j--] = nums2[i2--];
    }
}

以上题目其实还有多总解法,我们通过对这几道题的解答,能够对顺序表和数组有更深的理解就足够了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/629128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是数据结构

一、什么是数据结构 1、数据结构的定义 数据&#xff1a;从计算机的角度来看&#xff0c;数据是所有能被输入到计算机中且能被计算机处理的符号的集合。它是计算机操作的对象的总称&#xff0c;也是计算机处理信息的某种特定的符号表示形式&#xff08;二进制码的抽象表示&am…

【高级篇】服务异步通信

服务异步通信-高级篇 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一步都可能导致消息丢失&#xff0c;常见的丢失原因包括&#xff1a; 发送…

030 JavaWeb Html CSS

目录 JavaWeb概述1.访问web的原理2.C/S软件和B/S软件区别3.静态网站和动态网站 HTMLHTML的概述Table表格详细用法见W3CSchool.chm合并单元格课程表 img标签table和img标签组合使用a标签表单表单Get提交和post提交 div和span CSS1.CSS概述2.CSS语法3.CSS三种写法行内样式内部样式…

VueX使用简明笔记

1、作用&#xff1a; vuex是使用vue中必不可少的一部分&#xff0c;基于父子、兄弟组件&#xff0c;我们传值可能会很方便&#xff0c;但是如果是没有关联的组件之间要使用同一组数据&#xff0c;就显得很无能为力&#xff0c;那么vuex就很好的解决了我们这种问题&#xff0c;…

Knife4j的使用、SpringFox和SpringDoc介绍

knife4j是一个Swagger的增强工具&#xff0c;能够完善项目的接口文档。 官网&#xff1a; Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j Swagger的生成的默认文档确实不好用&#xff08;不美观、不支持搜索、不能导出&#xff09; 在Swagger2中使用 想一想…

Android 12.0 原生SystemUI下拉通知栏每条通知默认展开

1.前言 在12.0的系统rom原生开发中,在在对SystemUI下拉通知栏做定制的时候,在下拉状态栏的时候,通知栏中 最后一条通知默认是收缩的 点击按钮 就会展开 原生系统systemui就是如此,为了更美观 所以要求最后一条通知也默认展开,显得更美观 最终效果图: 2.原生SystemUI下拉通…

C++/C按照时间命名保存bin文件

背景 在Linux应用编程过程中&#xff0c;使用C或者C语言保存、读取bin文件是比较常见的需求。这里详细记录一下使用C保存bin文件&#xff0c;也可以使用C语言实现。 代码 C/C语言保存bin文件函数&#xff0c;C中也能使用 正确写入返回0&#xff0c;错误返回-1 // C 保存bi…

双重检查锁定与延迟初始化

双重检查锁定的由来 在Java程序中&#xff0c;有时候可能需要推迟一些高开销的对象初始化操作&#xff0c;并且只有在使用这些对象时才进行初始化。此时&#xff0c;程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧&#xff0c;否则很容易出现问题…

51单片机操作系统——RTX51 Tiny

简介 RTX51 是keil公司开发的一款实时操作系统&#xff0c;其有两个版本&#xff1a; 1.Tiny 2.Full&#xff0c;区别如下&#xff1a; RTX51 Full &#xff1a;使用四个任务优先权完成同时存在时间片轮转调度和抢先的任务切换 RTX51工作与中断功能相似的状态下 &#xff0c…

华为OD机试真题 JavaScript 实现【最远足迹】【2022Q4 100分】,附详细解题思路

一、题目描述 某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时&#xff0c;随身携带的记录器会不定期地记录自身的坐标&#xff0c;但在记录的间隙中也会记录其他数据。探索工作结束后&#xff0c;探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足…

【打卡】苹果叶片病害分类和建筑物变化检测数据挖掘竞赛

【打卡】苹果叶片病害分类和建筑物变化检测数据挖掘竞赛 文章目录 【打卡】苹果叶片病害分类和建筑物变化检测数据挖掘竞赛Task 1两个赛题数据可视化任务2 苹果病害数据加载与数据增强任务三 Task 1两个赛题数据可视化 在这个任务中&#xff0c;参赛选手需要对两个赛题的数据进…

卡奥斯开源社区六月创作之星挑战赛开始啦!

活动须知 发布优质文章争榜&#xff0c;获取专属勋章、流量扶持及奖励&#xff01; 活动时间&#xff1a;6 月 1 日- 6 月 30 日 奖品发放&#xff1a;7月10日 参与方式 完成认证发布优质文章&#xff0c;选中相关活动标签&#xff0c;文章默认参与活动 文章要求 文章符合…

宠物行业传统“夫妻店”,如何向“线下 线上”模式转型?

据研究&#xff0c;目前我国宠物店以单体店为主&#xff0c;占比高达85%。      这些单体店规模较小&#xff0c;以夫妻店为主&#xff0c;并且服务区域有限&#xff0c;较少涉及到大规模连锁运营。      同时&#xff0c;在我国宠物店形态中&#xff0c;区域性小规模的…

YOLOV5 训练

YOLOV5训练过程 CUDA 和cuDnnan 安装教程 windows上安装可以参考这篇知乎文章 数据集准备 自己准备数据集 可以使用 labelImg 工具&#xff0c;直接 pip install labelimg 就可以安装了。 命令行中输入 labelImg 就可以运行 标注数据的输出结果有多种过格式&#xff0c;V…

【数据结构与算法】掌握顺序栈:从入门到实践

&#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f331;系列专栏&#xff1a;数据结构与算法 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 前言 顺序栈的实现 初始化栈 判断栈空 判断栈满 入&#xff08;进&#xff09;栈 出栈 获取栈…

【算法系列 | 3】深入解析排序算法之插入排序

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 决定开一个算法专栏&#xff0c;希望能帮助大…

冒泡排序、插入排序、希尔排序、选择排序

一、排序协议的定义 在博客的开头的&#xff0c;我们先给出排序协议的定义。因为我们本篇博客含有多种排序方式&#xff0c;为了使每种排序方法对外调用方式一致&#xff0c;我们需要定义一个排序的相关协议。所有排序的相关类都必须遵循该协议&#xff0c;让此协议来定义具体…

Aiohttp异步爬取小说排行榜

Aiohttp异步爬取小说排行榜 *** Aiohttp简介及使用 *** ​ Aiohttp是Python的一个第三方网络编程模块&#xff0c; 它可以开发服务端和客户端&#xff0c;服务端也就是我们常说的网站服务器&#xff1b;客户端是访问网站的API接口&#xff0c;常用于接口测试&#xff0c;也可用…

Vue基础第七篇

一、vuex的使用 1.概念 在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间通信。 2.何时…

MyBatis操作数据库实现

说明&#xff1a;MyBatis是作用于三层架构开发&#xff0c;数据访问层&#xff08;Data Access Object&#xff09;的框架&#xff0c;用于访问数据库&#xff0c;对数据进行操作。 一、环境搭建 首先&#xff0c;创建一个SpringBoot模块&#xff0c;然后把MyBatis的环境搭建…