两个非递减顺序表合并成一个非递减顺序表

news2024/11/24 1:11:21

两个非递减顺序表合并成一个非递减顺序表

  • 引入

以下这个例题的描述是关于合并两个有序的数组,然后合并之后同样也是一个非递减的顺序排列

但是我名这里讲的不是顺序表,而是封装成一个顺序表,但是我们这里的顺序表其实底层同样是一个数组,所以解题的思路完全相同,我们接下来要讲的就是“两个非递减顺序表合成的一个非递减的顺序表”。


合并两个有序数组

给你两个按非递减顺序排列的整数数组 nums 1 和 nums 2,另有两个整数 m 和 n ,分别表示 nums 1 和 nums 2 中的元素数目。


请你合并 nums 2 到 nums 1 中,使合并后的数组同样按非递减顺序排列。


注意:最终,合并后数组不应由函数返回,而是存储在数组 nums 1 中。为了应对这种情况,nums 1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。Nums 2 的长度为 n 。

  • 我们是合并两个顺序表,只是多了一个封装顺序表的步骤,但是该题目的解法思路是大同小异的。

❤️理清思路

  • 非递减顺序表

    非递减就是 “”,而顺序表就是线性表的一种,其逻辑结构是顺序结构,同时其物理结构也和逻辑结构相同的结构,在计算机中存储的物理结构也是连续存储的。

  • 题目要求

    将两个 “非递减顺序表” 合成一个非递减的顺序表,那么我们在实现这个方法的时候需要传两个 “非递减顺序表”作为参数,然后我们就在方法中对这两个顺序表进行操作。并且最后合成的顺序表同样非递减的顺序表,那么我们在实现方法的时候就必须保证顺序表的顺序一致

  • 思路

    自定义一个"顺序表"数据结构,然后定义一个方法 merge (),这个方法要求是传进去两个“非递减的顺序表对象” 参数,分别是 list 1 和 list 2;然后我们在方法中重新 new 一个“新的非递减的顺序表对象”newList,然后定义三个指针分别指向这三个顺序表下标为 0 的位置,利用“穿针引线法”,完成合并工作。

  • 穿针引线法

    我在这里将这种方式描述为 "穿针引线法"是因为真的很形象,但是其实如果是在链表中这样称呼,似乎更加合适。

    我们分别让 i 和 j 永远指向即将进行比较大小的数据元素,然后让 k 在新顺序表中永远都指向“索引等于顺序表有效长度“ 的地方,然后等待 i 和 j 比较的结果的数据元素的插入,直到任意一个顺序表遍历完,
    如果同时遍历完, 那么合并的工作做完了;如果其中一个顺序表遍历玩,而另外一个没有遍历完,那么就把更长的顺序表直接加到 newList 顺序表中。
    综上所述,就完成了两个非递减顺序表的合并工作。


🚀代码实现

package TextReport;  
  
import java.util.Arrays;  
  
public class MyArrayList {  
    //    存放数据的数组  
    public int[] elem;  
    //    记录数组的有效长度  
    public int usedSize;  
    //    常量,用来给数组初始化容量  
    public static final int DEFAULT_CAPACITY = 5;  
  
    //    构造方法  
    public MyArrayList() {  
        this.elem = new int[DEFAULT_CAPACITY];  
    }  
  
    public MyArrayList(int defaultSize) {  
        this.elem = new int[defaultSize];  
    }  
  
    //    打印顺序表的方法(顺序表中有几个有效元素就打印几个有效元素)  
    public void display() {  
        for (int i = 0; i < usedSize; i++) {  
            System.out.print(this.elem[i] + " ");  
        }  
        System.out.println();  
    }  
  
    //    输入(新增加元素,默认在顺序表的最后一个元素的下一个位置上新增)  
    public void add(int data) {  
        try {  
            if (isFull()) {  
                elem = Arrays.copyOf(elem, 2 * elem.length);  
            }  
        } catch (NegativeArraySizeException e) {  
            e.printStackTrace();  
        }  
        Elem[usedSize++] = data;  
    }  
  
    //    在指定位置索引为 pos 新增元素  
    Public void addPos (int data, int pos) {  
        //先判断下标是否合法  
        Try {  
            CheckedAddPos (pos);  
            If (isFull ()) {  
                Elem = Arrays.CopyOf (elem, 2 * elem. Length);  
            }  
            For (int i = usedSize - 1; i > pos; i--) {  
                Elem[i + 1] = elem[i];  
            }  
            Elem[pos] = data;  
            UsedSize++;  
        } catch (PosIndexIllegalException e) {  
            e.getMessage ();  
        }  
  
    }  
  
    //判断顺序表中是否包含某个元素  
    Public boolean contains (int data) {  
        For (int i = 0; i < usedSize; i++) {  
            If (data == elem[i]) {  
                Return true;  
            }  
        }  
        Return false;  
    }  
  
    //返回某个元素的在容器中的索引  
    Public int indexOf (int find) {  
        For (int i = 0; i < usedSize; i++) {  
            If (find == elem[i]) {  
                Return i;  
            }  
        }  
        Return -1;  
    }  
  
  
    //获取指定下标 pos 的值  
    Public int getPos (int pos) {  
        Int retVal = -1;  
        //检查 pos 是否合法  
        Try {  
            CheckGetPos (pos);  
            RetVal = elem[pos];  
            ;  
        } catch (PosIndexIllegalException e) {  
            e.getMessage ();  
        }  
        Return retVal;  
    }  
  
    //      删除第一次出现关键字 key 的方法  
    Public void remove (int key) {  
        //先获取第一次出现 key 元素的下标  
        Int index = indexOf (key);  
        If (index == -1) {  
            System.Out.Println ("没有找到你要删除的数据!");  
            Return;  
        }  
        For (int i = index; i < usedSize - 1; i++) {  
            Elem[i] = elem[i + 1];  
        }  
        UsedSize--;  
    }  
  
    /**  
     * removeAll 方法删除整个顺序表  
     */  
    Public void removeAll () {  
        Elem = new int[5];  
        UsedSize = 0;  
    }  
  
    //    判满方法  
    Private boolean isFull () {  
        Return usedSize == elem. Length;  
    }  
  
    //    判断顺序表的下标是否合法  
    Private void checkedAddPos (int pos) {  
        if (pos < 0 || pos > usedSize) {  
            Throw new PosIndexIllegalException ();  
        }  
    }  
  
    //   判断下标 pos 是否合法  
    Private boolean checkGetPos (int pos) {  
        if (pos < 0 || pos >= usedSize) {  
            Return false;  
        }  
        Return true;  
    }  
  
    /**  
     * 获取顺序表的个数  
     *  
     * @return 返回数组的大小  
     */  
    Public int size () {  
        Return usedSize;  
    }  
  
  
}  
  
  
Class PosIndexIllegalException extends RuntimeException {  
    Public PosIndexIllegalException () {  
  
    }  
  
    Public PosIndexIllegalException (String msg) {  
        Super (msg);  
    }  
}

🍔测试程序

我们是在外部的程序 MyArrayListTest 中进行的测试,先准备两个顺序表,然后调用 merge 方法,并把两个参数传进去,然后会返回一个顺序表,我们再继续调用我们封装的 MyArrayList 类当中的 display 方法。

Package TextReport;  
  
Public class MyArrayListTest {  
    Public static void main (String[] args) {  
        //准备两个顺序表(非递减的顺序表)  
  
        MyArrayList myArrayList 1 = new MyArrayList ();  
        MyArrayList 1.Add (1);  
        MyArrayList 1.Add (5);  
        MyArrayList 1.Add (10);  
        MyArrayList 1.Add (13);  
  
        MyArrayList 1.Display ();  
        ;  
  
        MyArrayList myArrayList 2 = new MyArrayList ();  
  
        MyArrayList 2.Add (6);  
        MyArrayList 2.Add (11);  
        MyArrayList 2.Add (12);  
        MyArrayList 2.Add (33);  
        MyArrayList 2.Add (44);  
        MyArrayList 2.Add (47);  
        MyArrayList 2.Add (52);  
        MyArrayList 2.Add (66);  
  
        MyArrayList 2.Display ();  
        ;  
  
  
        //调用 merge 方法  
  
        MyArrayList mergeArrayList = merge (myArrayList 1, myArrayList 2);  
  
        //调用 display 方法  
        MergeArrayList.Display ();  
  
    }  
  
    /**  
     * 合并两个升序的非递减顺序表,并返回新的合成的顺序表  
     *  
     * @param list 1 按值非递减顺序表一  
     * @param list 2 按值非递减顺序表二  
     * @return 返回一个新的合并了的链表  
     */  
    Public static MyArrayList merge (MyArrayList list 1, MyArrayList list 2) {  
        MyArrayList newList = new MyArrayList (50);  
        Int i = 0, j = 0;  
        While (i < list 1.Size () && j < list 2.Size ()) {  
            If (list 1. Elem[i] < list 2. Elem[j]) {  
                NewList. Elem[newList. UsedSize] = list 1. Elem[i];  
                I++;  
                NewList. UsedSize++;  
            } else {  
                NewList. Elem[newList. UsedSize] = list 2. Elem[j];  
                J++;  
                NewList. UsedSize++;  
            }  
        }  
        While (i < list 1.Size ()) {  
            NewList. Elem[newList. UsedSize] = list 1. Elem[i];  
            I++;  
            NewList. UsedSize++;  
        }  
        While (j < list 2.Size ()) {  
            NewList. Elem[newList. UsedSize] = list 2. Elem[j];  
            NewList. UsedSize++;  
            J++;  
        }  
        Return newList;  
    }  
}


🥰测试结果

在这里插入图片描述


💗图文并茂

该图片是合并结束之后的图示,可以形象的看清楚 i ,j,k 这三个“指针是如何“行走的”。
注意:k 下标其实是 usedSize,是顺序表中的用来表示顺序表的有效长度。

在这里插入图片描述


🎊视频演示

这个视频简单的演示了我当前举的这个例子是如何进行合并的过程,时常两分钟,希望可以看完,这样可以更好的理解 “如何合并两个非递减的顺序表”。

两个非递减顺序表合并视频演示


点赞+收藏+关注💕
请添加图片描述

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

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

相关文章

复盘|攻防实战中面对“谍影重重”,如何出奇制胜?

随着“数字孪生”概念的深入人心&#xff0c;数字化转型的进展也是一日千里。与此同时&#xff0c;在网络世界中的攻防对抗热度有增无减&#xff0c;甚至连最顶级的安全团队一不小心也会中招。在攻防演练中发生过好几次这种情况&#xff1a;腾讯安全一线的分析人员在前方为攻击…

ATSHA204A国产替代新选择:LCSHA204

ATSHA204A是一款用于固件版权保护&#xff0c;防抄板仿克隆的加密芯片。包含多达16个密钥存储区用于安全存储密钥。同时提供OTP区用于存储用户固定信息。因推出时间早以及芯片本身的安全性在中国市场的使用量非常大。 受当前全球经济和大环境的影响造成该芯片供货严重不足&…

基于Python+DenseNet121算法模型实现一个图像分类识别系统案例

目录 介绍在TensorFlow中的应用实战案例最后 一、介绍 DenseNet&#xff08;Densely Connected Convolutional Networks&#xff09;是一种卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;2017年由Gao Huang等人提出。该网络的核心思想是密集连接&#xff0c;即每…

正中优配:怎样开通创业板交易权限?

创业板是我国证券商场的一种特别板块&#xff0c;主要面向创业型企业和高科技企业&#xff0c;至今已成为我国股票商场中较为热门的板块之一。关于投资者来说&#xff0c;能够在创业板中买卖不仅可以发掘到更多有潜力的企业&#xff0c;还可能带来更高的收益。那么&#xff0c;…

关于DC电源模块的过流保护功能说明

BOSHIDA 关于DC电源模块的过流保护功能说明 DC电源模块是一种常见的电源供应模块&#xff0c;广泛应用于各种电子设备和系统中。为了确保电源模块的安全和可靠性&#xff0c;通常会设置过流保护功能。 过流保护功能是指当电源模块输出电流超过额定电流时&#xff0c;会自动切…

CountDownLatch原理-(主线程等待子线程结束再执行)

CountDownLatch是共享锁的一种实现,它默认构造 AQS 的 state 值为 count。当线程使用countDown方法时,其实使用了tryReleaseShared方法以CAS的操作来减少state,直至state为0就代表所有的线程都调用了countDown方法。当调用await方法的时候&#xff0c;如果state不为0&#xff0…

zabbix监控实战

1 zabbix监控平台部署 更改的密码为HLThlt123 创建zabbix数据库 配置zabbix server 配置zabbix前端 启动服务 访问 更改成中文 修改字体文件 2 zabbix添加监控节点 在客户端 在server端 手动添加 自动添加 03 zabbix api 自动注册 停掉自动发现 删掉server3 自动注册 3 zab…

通讯软件015——分分钟学会Kepware OPC HDA Server仿真配置

本文介绍如何使Kepware软件仿真OPC HAD Server配置。相关软件可登录网信智汇&#xff08;wangxinzhihui.com&#xff09;下载。 1、创建1个数据源&#xff1a;本案例采用“Graybox.Simulator.1”作为数据源。连接OPC Server数据源“Graybox.Simulator.1”。 右键点击“连通性”…

Ubuntu下Python3与Python2相互切换

参考文章&#xff1a;https://blog.csdn.net/Nicolas_shen/article/details/124144931 设置优先级 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 200

day-41 代码随想录算法训练营(19)动态规划 part 03

343.整数拆分 思路&#xff1a; 1.dp存储的是第i个数&#xff0c;拆分之后最大乘积2.dp[i]max(dp[i],max(j*(i-j),j*dp[i-j]));3.初始化&#xff1a;dp[0]dp[1]0,dp[2]1;4.遍历顺序&#xff1a;外层循环 3-n&#xff0c;内层循环 1-i 2.涉及两次取max&#xff1a; dp[i] 表…

【前端】CSS-Flex弹性盒模型布局

目录 一、前言二、Flex布局是什么1、任何一个容器都可以指定为Flex布局2、行内元素也可以使用Flex布局3、Webkit内核的浏览器&#xff0c;必须加上-webkit前缀 三、基本概念四、flex常用的两种属性1、容器属性2、项目属性 五、容器属性1、flex-direction①、定义②、语句1&…

Matlab进阶绘图第27期—水平双向堆叠图

在上一期文章中&#xff0c;分享了Matlab双向堆叠图的绘制方法&#xff1a; 进一步&#xff0c;再来看一下水平双向堆叠图的绘制方法&#xff08;由于Matlab中未收录水平双向堆叠图的绘制函数&#xff0c;因此需要大家自行设法解决&#xff09;。 先来看一下成品效果&#xff…

MyBatis关联关系映射详解

前言 在使用MyBatis进行数据库操作时&#xff0c;关联关系映射是一个非常重要的概念。它允许我们在数据库表之间建立关联&#xff0c;并通过对象之间的关系来进行数据查询和操作。本文将详细介绍MyBatis中的关联关系映射&#xff0c;包括一对一、一对多和多对多关系的处理方法…

第七章:敏捷开发工具方法-part1-敏捷开发基础

文章目录 一、Scrum基础概念1.1 传统开发模式与敏捷开发的区别1.2 传统项目管理与敏捷项目管理的区别1.3 敏捷宣言1.4 敏捷开发的特征1、敏捷的方法 二、角色与职责2.1 Scrum Team2.2 角色职责总结2.3、研发阶段概览1、Sprint计划会议2、产品实施阶段3、Sprint评审会议4、Sprin…

深度解析BERT:从理论到Pytorch实战

本文从BERT的基本概念和架构开始&#xff0c;详细讲解了其预训练和微调机制&#xff0c;并通过Python和PyTorch代码示例展示了如何在实际应用中使用这一模型。我们探讨了BERT的核心特点&#xff0c;包括其强大的注意力机制和与其他Transformer架构的差异。 关注TechLead&#x…

Web Components详解-Shadow DOM基础

目录 引言 概念 基本用法 attachShadow函数 mode&#xff08;模式&#xff09; delegatesFocus&#xff08;委托聚焦&#xff09; Custom ElementsShadow DOM 基本用法 样式及属性隔离 写在最后 相关代码 参考文章 引言 上篇文章的自定义标签中&#xff0c;我们使…

iWatch框架设计

iWatch框架设计 一、项目框架结构设计 1、项目文件介绍 OverSeaProject&#xff1a;是IOS相关文件文件内容iWatchApp和iWatch Extension&#xff1a;是之前使用xcode14之前的xcode创建的360 app的Watch App&#xff0c;产生的文件结构&#xff0c;包含一个app和Extension的ta…

leetcode 1609.奇偶树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;奇偶树 思路&#xff1a; 树的层序遍历&#xff0c;用队列辅助。用一个变量记录当前是多少层&#xff0c;以及当前层的节点个数&#xff0c;依次遍历&#xff0c;因为需要判断当前层是否严格递增或递减&#xff0c;如果正…

突破销售瓶颈:亚马逊卖家如何借力TikTok网红营销?

随着社交媒体的崛起&#xff0c;营销方式也在不断变革。TikTok作为一款风靡全球的短视频平台&#xff0c;吸引了数以亿计的用户&#xff0c;成为了品牌宣传和销售的新热点。对于亚马逊卖家而言&#xff0c;通过合理运用TikTok网红营销策略&#xff0c;可以有效提升产品的曝光度…