算法通关村第三关——不简单的数组增删改查

news2024/9/20 1:29:49

线性表基础

线性表概念

线性表就是具有相同特征数据元素的一个有限序列,其中包含元素的个数称为线性表的长度

线性表类型

 从不同的角度看,线性表有不同的分类

语言实现角度

顺序表有两种实现方式

一体式

分离式 

image.png

一体式结构

        一体式:存储信息的单元 和 元素存储区  以连续的方式被安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对象。

        这种结构整体性强,易于管理,但是由于数据元素存储区是表对象的一部分,顺序表创建后,元素存储区就固定了

        C和C++都是一体式的结构 

分离式结构 

        分离式:表对象里只保存与整个表有关的信息(容量和元素个数),实际数据元素被放在另一个独立的元素存储区里,通过连接与基本表对象关联

        Java和Python是分离式结构

存储角度 

顺序型

链表型

顺序型存储

        顺序型:就是将数据存放在一段固定的区域内,此时访问元素的效率非常高,但是删除和增加元素代价比较大,如果要扩容,只能整体搬迁。

链表型存储

         链表型:元素之间是通过地址一次连接的,因此访问时必须从头开始逐步向后找,查找效率低;而删除和增加元素非常方便,并且也不需要考虑扩容的问题。

        链表型的常见实现方式有:单链表、循环链表、双向链表等。

访问限制的角度

受限线性表

        栈和队列被称为访问受限的线性表。因为它们的  插入和删除操作受到了限制,只能在固定的位置进行。 

        Hash比较特殊, 其内部真正存储数据的一般是数组,但是访问是通过映射来实现的,因此大部分材料中并不将Hash归结到线程表中

扩容角度

动态顺序表

        采用分离式结构的顺序表,若将数据区更换为存储空间更大的区域,则可在不改变表对象的前提下对其数据存储区进行扩充,所有使用这个表的地方都不必修改,只要程序的运行环境还有空闲存储。

        这种表结构不会因满了二导致操作无法进行,人们把采用这种技术实现的顺序表称为动态顺序表,因为其容量可以在使用中动态变化。 

 扩充的策略
  • 每次扩充增加固定数目的存储位置

        如:每次扩充增加10个元素位置,这种策略称为线性增长。

        特点:节省空间,但是扩充操作频繁,操作次数多。

  • 每次扩充容量加倍

        如:每次扩容增加一倍的存储空间。

        特点:减少了扩充操作的执行次数,但可能会浪费空间资源。是以空间换时间,推荐的方式

线程表的操作

        线性表的常见操作有初始化、求表长、增删改查等。事实上,每种数据结构都至少要有这几种操作,大部分的基础算法题都是基于此扩展的 

线性表的操作如下

image.png

数组的概念

数组是线性表最基本的结构,特点是元素是一个紧密在一起的序列。相互之间不需要记录彼此的关系就能访问。

数组中要注意的点

  • 数组下标从0开始记录
    • 例:第一个存储元素的位置是a[0],最后一个元素位置是a[length - 1]
  • 数组中的元素在内存中是连续存储的,且每个元素占用着相同大小的内存
  • 数组空间不一定是满的
    • 例:空间为100的数组,可能只用了10个位置(数组中的元素数量),所以要注意数据个数的变量是size,数组长度length 可能不一样。

数组存储元素的特征

        数组存储元素的过程 

  • 一,我创建了一个大小为10的数组,请问此时数组里面是什么?
  • 答: 不同的语言处理会不一样,在c语言里每个位置都是一个随机数。而在java里,默认会初始化为0。而python更为灵活可以直接指定是什么,例如a =[1,2,3,4],就是数组里有四个元素,而a = [O for i in range(10)]这样定义的数组就是[0,0,0,0,0,,0,0,0, 0]

  • 二: 是否可以只初始化一部分位置?
  • 初始化的本质是什么?答: 当然可以,你可以将前面5个位置依次,后面的空着,此时数组内容为[1,2,3,4,5,0,0,0,0,0,1],初始化的本质就是覆盖已有的值,用你需要的值覆盖原来的0,因为数组本来是{0,0,0,0,0,0,0,0,0,0},这里只不过被你替换成了{1,2,3,4,5,0,0,0,0,0}。如果此时你想知道有效元素的个数,就必须再使用一个额外的变量,例如size来标记。

  • 三.上面已经初始化的元素之间是否可以空着,例如初始化为{1,0,0,4,5,0,2,0,3,0}。其中0位置仍然是未初始化的?
  • 答:不可以!绝对不可以!要初始化,就必须从前向后的连续空间初始化,不可以出现空缺的情况,这是违背数组的原则的。你正在进行某种运算期间可以先给部分位置赋值,而一旦稳定了,就不可以再出现空位置的情况。

  • 四: 如果我需要的数据就是在中间某一段该怎么办呢? 例如r0,0,3,4,5,6,7,0,0,01,此时该怎么拿到从3到7的元素呢?
  • 答:你需要使用两个变量,例如left=2,right=6来表示区间[left,right]是有效的。

  • 五: 我删除的时候,已经被删除的位置该是什么呢? 例如原始数组为{1,2,3,4,5,6,7,8,0,01,我删除4之后,根据数组的移动原则,从5开始向前移动变成{1,2,3,5,6,7,8,?,0,0},那原来8所在的位置应该是什么呢?
  • 答:仍然是8,也就是删除4之后的结构为(1,2,3,5,6,7,8,8,0,0},此时表示元素数量的size会减1变成7,原来8的位置仍然是8。因为我们是通过size来标记元素数量的,所以最后一个8不会被访问到。

  • 第六炮: 这个里8看起来很不爽啊,是否可以再优化一下?
  • 答: 不爽就不爽,习惯就好!不用优化,优化了也没啥用

数组的基本操作

数组的重要性

为什么数组的题目特别多呢,因为很多题目本质就是查找问题,而数组是查找的最佳载体。很多复杂的算法都是为了提高查找效率的,例如二分查找、二叉树红黑树、B+树、Hash和堆等等。另一方面很多算法问题本质上都是查找问题例如滑动窗口问题、回溯问题、动态规划问题等等都是在寻找那个目标结果。

查找一个元素

进行等值的线性查找,题目:

        如果数组是递增的,此时查找时如果相等 或者 当前位置元素比目标值更大就停下来,使用代码实现

实现代码 

    /**
     *  如果数组是递增的,此时查找时如果相等 或者 当前位置元素比目标值更大就停下来,使用代码实现
     * @param arr 给定的数组
     * @param size 数组中以存在的元素长度
     * @param element 待查找的元素
     * @return  该元素
     */
    public int findElement(int [] arr ,int size , int element){
        for (int i = 0; i < size; i++) {
            if (arr[i] == element){
                return i;
            }else if (arr[i] > element){
                return -1;
            }
        }
        return -1;
    }

增加一个元素

题目:

        将给定的元素插入到有序的数组的对应位置中

实现方法一

    /**
     *  题目
     *  将给定的元素插入到有序的数组的对应位置中
     * @param arr  有序数组
     * @param size 数组已经存储的元素数量(从1开始计算)
     * @param element 要插入的元素
     * @return 插入元素的下标
     */
    public int addElementSequence(int [] arr , int size , int element){
        // 判断边界
        if (size >= arr.length){
            return -1;
        }
        // 定义插入元素的下标
        int index = size;
        // 通过循环,找到比要插入元素小的位置,将下标赋值
        for (int i = 0; i < size; i++) {
            if (arr[i] > element){
                index = i;
                break;
            }
        }
        // 元素往后移
        for (int i = size; i > index ; i --) {
            // 后移一个位置
            arr[i] = arr[i--];
        }
        // 将下标为index的元素设为element
        arr[index] = element;
        return index;
    }

实现方法二

 

    public int addElementSequenceFromEnd(int [] arr , int size , int element){
        if (size >= arr.length){
            return -1;
        }
        int index = 0;
        for (int a : arr) {
            if (a <= element){
                index++;
            }else {
                arr[index] = element;
                break;
            }
        }
        return index;
    }

删除一个元素

题目:删除一个元素

代码实现

   /**
     * 删除一个元素
     * @param arr 给定的数组
     * @param size 数组中元素的个数
     * @param element 要删除的元素
     * @return 删除元素后数组的长度
     */
    public int removeElement(int [] arr , int size , int element){
        int index = -1;
        // 如果存在,找到该元素,并设置该元素下标
        for (int i = 0; i < size; i++) {
            if (arr[i] == element){
                index = i;
            }
        }

        // 如果找到元素,index就不等于-1;如果没找到,就等于默认值-1,直接退出
        if ( index != -1){
            //
            for (int i = index +1; i < size; i++) {
                arr[i-1] = arr[i];
            }
            // 长度减一
            size--;
        }
        return size;
    }

单调数组问题

题目:

        判断一个数组是否是单调递增的

方法一

    /**
     * 题目
     * 判断一个数组是否是单调递增的
     * @param arrs 给定的数组
     * @return 是/否  单调递增
     */
    public boolean isMonotonic(int [] arrs){
        return isSort(arrs,true)|| isSort(arrs,false);
    }
    public boolean isSort(int [] nums , boolean increasing){
        int length = nums.length;
        for (int i = 0; i < length - 1; i++) {
            if (increasing){
                if (nums [i] > nums[i+1] ){
                    return false;
                }
            }else {
                if (nums[i] < nums[i+1]){
                    return false;
                }
            }
        }
        return true;
    }

 方法二(优化):

    public boolean isMonotonicByOntMethod(int [] arr){
        boolean inc = true, dec = true;
        for (int i = 0; i < arr.length -1; i++) {
            if (arr[i] > arr[i+1]){
                inc = false;
            }
            if (arr[i] < arr[i+1]){
                dec = false;
            }
        }
        // 如果是单调的 ,返回结果为true;如果不是单调的,返回结果为false
        return inc || dec;
    }

题目:

        给定一个潘旭数组和一个目标值,在数组中找打目标值,并党徽其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置

   /**
     * 题目:
     * 给定一个潘旭数组和一个目标值,在数组中找打目标值,并党徽其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置
     * @param nums 有序数组
     * @param target 要插入数组中的目标值
     * @return 目标值的索引
     */
    public int searchInsert(int [] nums , int target){
        int length = nums.length;
        int left = 0 , right = length -1 , index = length;
        while (left <= right){
            int mid = ((right - left) / 2)+ left;
            if (target <= nums [mid] ){
                index = mid;
                right = mid -1;
            } else {
                left = mid + 1;
            }
        }
        return index;
    }

 

数组合并问题 

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

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

相关文章

Softing mobiLink——连接现场设备的优选方案

| 用于智能现场设备管理的移动配置工具 从技术人员的角度来看&#xff0c;过程自动化可能会成为一个主要的管理难题&#xff0c;因为其实际上有无限数量的可配置参数及各种通信协议和现场设备接口。由来自多个制造商生产的上千台现场设备组成的现代过程架构&#xff0c;使技术…

Chapter 10: Dictionaries | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介DictionariesDictionariesDictionary as a set of countersDictionaries and filesLooping and dictionariesAdvanced text parsingDebuggingGlossary Python for Everybody Exploring Data Using Python 3 Dr. Charles R. Severance 课程…

《向量数据库指南》——腾讯云向量数据库Tencent Cloud VectorDB产品特性,架构和应用场景

腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持 10 亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提…

Window版本ES(ElasticSearch)的安装,使用,启动

首先我这里是根据小破站狂神说up主&#xff0c;而学习的&#xff0c;下面是笔记文档&#xff0c;文档可能比我更细&#xff0c;但我还是记录一下&#xff0c;嘿嘿嘿 ElasticSearch7.6入门学习笔记-KuangStudy-文章 下面直接开始&#xff0c;首先我们需要下载ELK三个安装包&…

spring boot合并 http请求(前后端实现)

为什么要合并http请求 页面加载时要初始化很多资源信息&#xff0c;会发送好多http请求&#xff0c;根据http的通信握手特点&#xff0c;多个http请求比较浪费资源。进而如果能将多个http请求合并为一个发送给服务器&#xff0c;由服务器获取对应的资源返回给客户端 奇思妙解 …

echarts实现正负轴柱状图

效果&#xff1a; data变量配置&#xff1a; // 正负柱状图zhengfuZhu: {},data1: [],data2: [],data3: [],data4: [],xAxisData1: [],//横轴刻度seriesLabel: { //柱子上的字体show: false,position: outside,color: #BEC3EB,},seriesEmphasis: { //itemStyle: {shadowBlur: …

【福建事业单位-语言理解】01中心理解

【福建事业单位-语言理解】01中心理解 一、中心理解题&#xff1a;关键词1.1 转折关系词总结 1.2因果关系词总结 1.3必要条件关系对策&#xff08;只有才的变体题型&#xff09;反面论证&#xff08;如果等词汇错误做法不好的结果&#xff09;对策特殊脉络总结 1.4 并列结构总结…

怎么找小红书美食探店博主合作?

在小红书上有许多活跃的美食探店博主&#xff0c;他们通过分享自己的餐厅体验、特色美食以及口味评价&#xff0c;吸引了大量用户的关注。对于想要在小红书上进行美食推广的企业来说&#xff0c;与这些博主合作是一种非常直接的方式&#xff0c;接下来伯乐网络传媒来给大家分享…

【已解决】标签死活不响应单击事件

大家好&#xff0c;我是执念斩长河。今天在公司写代码的时候突然遇到一个问题&#xff0c;这个问题困扰了我不久&#xff0c;就是html中li标签不能响应我的单击事件。最后在仔细分析下&#xff0c;解决了这个问题。 文章目录 1、问题来源2、问题解决方案3、问题解决效果4、总结…

C语言假期作业 DAY 10

一、选择题 1、求函数返回值&#xff0c;传入 -1 &#xff0c;则在64位机器上函数返回&#xff08; &#xff09; int func(int x) { int count 0; while (x) { count; x x&(x - 1);//与运算 } r eturn count; } A: 死循环 B: 64 C: 32 D: 16 答案解析 正确答案&#xff…

Elasticsearch:如何将整个 Elasticsearch 索引导出到文件 - Python 8.x

在实际的使用中&#xff0c;我们有时希望把 Elasticsearch 的索引保存到 JSON 文件中。在之前&#xff0c;我写了一篇管如何备份 Elasticsearch 索引的文章 “Elasticsearch&#xff1a;索引备份及恢复”。在今天&#xff0c;我们使用一种 Python 的方法来做进一步的探讨。你可…

SpringBoot复习:(12)SpringApplicationRunListener和 SpringApplicationRunListeners

SpringApplicationRunListener接口定义如下&#xff1a; public interface SpringApplicationRunListener {default void starting() {}default void environmentPrepared(ConfigurableEnvironment environment) {}default void contextPrepared(ConfigurableApplicationConte…

2023年【零声教育】13代C/C++Linux服务器开发高级架构师课程体系分析

对于零声教育的C/CLinux服务器高级架构师的课程到2022目前已经迭代到13代了&#xff0c;像之前小编也总结过&#xff0c;但是课程每期都有做一定的更新&#xff0c;也是为了更好的完善课程跟上目前互联网大厂的岗位技术需求&#xff0c;之前课程里面也包含了一些小的分支&#…

【连通块染色,双指针维护区间map,整除分块】CF616 CDE

Dashboard - Educational Codeforces Round 5 - Codeforces C 题意&#xff1a; 思路&#xff1a; 经典的给格子染色&#xff0c;直接dfs染色就行&#xff0c;不要用并查集&#xff0c;虽然也能做但是不好写 然后对于每一个*&#xff0c;把周围的格子的颜色扔到set里去重统…

什么叫做阻塞队列的有界和无界

问题描述 什么叫做阻塞队列的有界和无界&#xff1a; 解决方案&#xff1a; 1. 阻塞队列&#xff08;如图&#xff09;&#xff0c;是一种特殊的队列&#xff0c;它在普通队列的基础上提供了两个附加功能 a. 当队列为空的时候&#xff0c;获取队列中元素的消费者线程会被阻塞…

ChinaJoy 2023微星雷鸟17游戏本震撼发布:搭载AMD锐龙9 7945HX首发8499元

ChinaJoy 2023展会中微星笔记本再次给大家带来惊喜&#xff0c;发布了搭载AMD移动端16大核的旗舰游戏本&#xff1a;雷鸟17&#xff0c;更重要的这样一款旗舰性能的游戏本&#xff0c;首发价8499元堪称当今游戏本市场中的“性价比爆款”&#xff01; 本着和玩家一同制霸游戏战场…

leetcode 712. Minimum ASCII Delete Sum for Two Strings(字符串删除字母的ASCII码之和)

两个字符串s1, s2, 删除其中的字母使s1和s2相等。 问删除字母的最小ASCII码之和是多少。 思路&#xff1a; DP 先考虑极端的情况&#xff0c;s1为空&#xff0c;那么要想达到s2和s1相等&#xff0c;就要把s2中的字母删完&#xff0c; ASCII码之和就是s2中所有字母的ASCII码之…

大型集团企业一体化运维监控方案

当前&#xff0c;云计算、大数据、人工智能等IT技术迅猛发展&#xff0c;企业的信息化步入了一个崭新的时代&#xff0c;企业规模不断壮大&#xff0c;业务不断拓展&#xff0c;企业信息化依赖的网络结构和IT技术越来越复杂。企业运维部门采用的运维工具和技术实力直接决定企业…

算法训练营第五十七天||647.回文子串、516.最长回文子序列、动态规划总结

647.回文子串 出自代码随想录 如果大家做了很多这种子序列相关的题目&#xff0c;在定义dp数组的时候 很自然就会想题目求什么&#xff0c;我们就如何定义dp数组。 绝大多数题目确实是这样&#xff0c;不过本题如果我们定义&#xff0c;dp[i] 为 下标i结尾的字符串有 dp[i]个…

Cordova+Vue2.0打包apk,保姆教程来袭!

1.环境准备&#xff08;全部都需要配置环境变量&#xff09; java version "1.8.0_341" 安卓sdk android-29 Gradle 4.10.1 node v16.16.0 cordova 10.0.0 (cordova-lib10.1.0)2.安卓环境变量 1. 确认已安装 Android SDK Build-Tools 和 Android SDK Platform-Tool…