【数据结构】解决顺序表题的基本方法

简介: 【数据结构】解决顺序表题的基本方法

前言


 大家在处理数组相关的oj题时,一般通过遍历的方式,但是这样会导致时间复杂度非常的高。下面我来介绍一下通过空间换时间和双指针的方式减小时间复杂度!


一.空间换时间的方式:


栗子:


原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。oj题


62e68b3f9f2648971c1c720471a501ed_4e2fd90b1dcc48748a98f5d1d3630455.png


 家人们刚开始做这题时很可能会通过遍历数组,然后将后面的数字往前移,这样就会导致时间复杂度非常高。

 这个时候我们就可以通过牺牲空间,节省时间的方式来降低时间复杂度。

 通过创建一个新数组,来保存保留的数据,这样就通过牺牲空间节省了时间。但是这题需要空间复杂度为O(1),说明不能创建额外的n个空间,那么我们该怎么办呢?下面的双指针方式会告诉你如何去做,可以先看看代码:


void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int end1=m-1,end2=n-1,dst=m+n-1;
    while(end1>=0&&end2>=0)
    {
        if(nums1[end1]>nums2[end2])
        {
            nums1[dst--]=nums1[end1--];
        }
        else
        {
            nums1[dst--]=nums2[end2--];
        }
    }
    while(end2>=0)
    {
        nums1[dst--]=nums2[end2--];
    }
}



6a9e353b465418129ecaaafc06d13308_323466e293264880b88b6fbbe2456a8b.png


二.多指针方式:


 这里我们指的指针,在数组里面可以用数字来代替,因为数组是可以通过[]访问的,但是后面链表所用的指针就是真的指针了。

 多指针的使用是非常重要的方法,但是非常依赖画图,所以只要同学们多画图,此类题目不会很难解决。

栗子:

合并两个有序数组oj题


8cc6c2edf9161d1343c2e66bed6502d7_33084899227a47db941424d3e912d989.png


 对于合并两个有序数组,兄弟们很有可能将两个数组合并,然后进行排序。然而,这样编写的后果是时间复杂度会比较高。


 我们创建一个新数组(牺牲空间),通过两个数字分别标记两个数组,通过比较,得到最终的排好序的数组。


ec93e38919a56a2592e26a4924ec20c3_f3c836f256ce47e3b4a6bac865b6164a.png


 然而这道题的数组空余部分是0,所以我们要从后往前排序,并且在原数组里排序,这个时候也需要通过两个指针来标记。


0980b85af5123ae52c3cd43b909e5446_961e4237415f498c8a5c6ceb3d13af3b.png


void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int end1=m-1,end2=n-1,dst=m+n-1;
    while(end1>=0&&end2>=0)
    {
        if(nums1[end1]>nums2[end2])
        {
            nums1[dst--]=nums1[end1--];
        }
        else
        {
            nums1[dst--]=nums2[end2--];
        }
    }
    while(end2>=0)
    {
        nums1[dst--]=nums2[end2--];
    }
}



总结


 总的来说,这两种方法就是解决顺序表的主题思路。对于数据结构,家人们一定不要空想,要多通过画图解决问题。


目录
相关文章
|
26天前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
78 4
|
2月前
|
存储 编译器 C语言
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
63 2
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
1月前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
76 3
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
2月前
|
Java C++ 索引
让星星⭐月亮告诉你,LinkedList和ArrayList底层数据结构及方法源码说明
`LinkedList` 和 `ArrayList` 是 Java 中两种常见的列表实现。`LinkedList` 基于双向链表,适合频繁的插入和删除操作,但按索引访问元素效率较低。`ArrayList` 基于动态数组,支持快速随机访问,但在中间位置插入或删除元素时性能较差。两者均实现了 `List` 接口,`LinkedList` 还额外实现了 `Deque` 接口,提供了更多队列操作。
29 3
|
2月前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
41 6
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
28 3
|
2月前
|
存储 算法 Java
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
前缀(波兰)表达式、中缀表达式和后缀(逆波兰)表达式的基本概念、计算机求值方法,以及如何将中缀表达式转换为后缀表达式,并提供了相应的Java代码实现和测试结果。
119 0
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
|
2月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
36 2