ACM金牌选手算法讲解《线性表》
导读:
哈喽,大家好,我是编程熊,双非逆袭选手,字节跳动、旷视科技前员工,ACM亚洲区域赛金牌,保研985研究生,分享算法与数据结构、计算机学习经验,帮助大家进大厂~
关注下方公众号,学习硬核知识
线性表
LeetCode刷题过程中,常常用到的线性表主要包括以下四个重要的数据结构: 数组、链表、栈、队列。
下面将分别讲解数组、链表、栈和队列。
线性表概述
线性: 这里的线性是逻辑上的连续,而非物理存储的连续。
存储的数据: 线性表是一个有n
个相同类型数据的有序序列。
数组array
介绍
数组是物理存储连续的线性表,其常见的形式为 a[0]、a[1] ... a[n-1]
,a[i-1]
是 a[i]
的前驱,a[i+1]
是 a[i]
的后继。
基本操作
插入
插入元素,要将插入位置后的元素全部向后移动一位。
下图以数组长度为6,数据为0、1、2、3、4、5
,在位置3插入一个元素X举例。
删除
删除元素,要讲删除位置后的元素全部向前移动一位。
下图以数组长度为6,数据为0、1、2、3、4、5
,删除位置3上的元素X举例。
反转
翻转数组,本质是将数组存储的数据进行反转。
下图以数组长度为6,数据为0、1、2、3、4、5
,反转整个数组举例。
例题
LeetCode 27. 移除元素
题意
删除数组中所有等于 val
的元素,返回移除后数组的新长度。要求不使用额外的空间。
示例
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
题解
数组的删除操作,但如何不使用额外的空间呢?因为删除val
后的数组的长度小于等于原数组的长度,因此可以一边将不等于val
的数组放入原数组中,同时判断原数组的数是否等于val
。
代码
class Solution {public int removeElement(int[] nums, int val) {// left 存当前nums数组中不等于val的数字数量int left = 0; for (int right = 0; right < nums.length; right++) {if (nums[right] != val) {nums[left] = nums[right];left++;}}return left;}
}
习题推荐
LeetCode 35. 搜索插入位置
链表
介绍
链表的出现是为了解决数组插入、删除带来的线性开销。
区别于数组,链表中的元素可以不连续存储,每一个元素包含该 元素的数据 和 指向链表下一个节点的指针。
基本操作
插入
插入元素,要将插入元素前一个位置的指针指向插入元素本身,将插入元素的指针指向前一个位置。
删除
删除元素,要将 删除元素前一个元素的指针 指向 删除元素后一个元素,代码实现上需要将 删除元素指针指向的位置 记录下来。
下图是以长度为5的链表,删除位置3上的元素为例子。
翻转
翻转链表,可以一边遍历同时用一个临时变量记录 当前元素的下一个元素的指针 所指向的位置,然后再将 当前元素的 下一个元素的指针 指向自己。
下图是以长度为5的链表,翻转链表为例子。
例题
1. LeetCode 206. 反转链表
题意
给单链表的头节点 head
,请反转链表,并返回反转后的链表。
示例
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
题解
按上述链表翻转操作思路实现代码。
代码
public ListNode reverseList(ListNode head) {// pre 存的是当前节点的上一个节点ListNode prev = null;// curr 存的是当前链表遍历到节点ListNode curr = head;while (curr != null) {// next 存的是当前节点下一个节点ListNode next = curr.next;curr.next = prev;prev = curr;curr = next;}return prev;
}
习题推荐
LeetCode237. 删除链表中的节点
LeetCode 21. 合并两个有序链表
LeetCode 160. 相交链表
栈和队列
栈
栈被限定必须在栈顶进行插入和删除操作,因此其特点为是后进先出。
下图是栈的插入(入栈)、删除(出栈)示意图。
队列
队列被限定在队头进行删除操作,队尾进行插入操作,因此其特点为先进先出。
下图是队列的插入(入队)、删除(出队)示意图。
基本操作
栈和队列的插入和删除操作上图已解释。
例题
LeetCode 155. 最小栈
题意设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
push(x)
—— 将元素 x 推入栈中。pop()
—— 删除栈顶的元素。top()
—— 获取栈顶元素。getMin()
—— 检索栈中的最小元素。
示例
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]输出:
[null,null,null,null,-3,null,0,-2]解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
题解
建一个辅助栈,辅助栈的栈顶表示原栈所有数字最小值,下面分别讨论题目要求的四种操作,如何实现。
push(x)
: 若插入的数字小于等于辅助栈的栈顶元素,则这个数字在原栈是最小值(之一),我们将其插入辅助栈中。pop():
若原栈删除的数字等于辅助栈的栈顶元素,则这个数字在原栈是最小值(之一),我们同时原栈和辅助栈的栈顶元素;反之,只删除原栈栈顶元素。top():
返回原栈的栈顶元素。getMin():
返回辅助栈的栈顶元素。
代码
class MinStack {public Stack<Integer> s, min_s;public MinStack() {s = new Stack<>();min_s= new Stack<>();}public void push(int x) {s.push(x);if(min_s.isEmpty() || x <= min_s.peek())min_s.push(x);}public void pop() {if(s.pop().equals(min_s.peek()))min_s.pop();}public int top() {return s.peek();}public int getMin() {return min_s.peek();}
}
习题推荐
LeetCode 20. 有效的括号
---END---
你好,我是编程熊,本科毕业于双非学校,校招时拿下字节跳动SP、旷视科技SP,也拿过ACM亚洲区域赛金牌,最终神奇保研985的研究生。
希望分享的知识和人生经验可以帮助到你。
ACM金牌选手算法讲解《线性表》相关推荐
- 算法到底该怎么学?算法数据结构Java编程超全干货!(ACM金牌选手分享超牛学习路径~)...
怎么才能最快的学习算法呢?(ps:文末附2022大厂面试真题~) 这是很多知友都关心的话题,作为一个ACM金牌选手,根据我的专业角度,特给大家来分享一下! 学习算法,切记不要一上来就开始啃<算法 ...
- 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)
C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...
- 从零开始学数据结构和算法(二)线性表的链式存储结构
链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...
- rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)
原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...
- 数据结构与算法(一) 线性表之顺序表
线性表是一种最简单.最常用的数据结构,根据存储方式可以分为顺序表和链表. 顺序表: 顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequent ...
- 数据结构和算法基础--线性表
数据结构和算法基础–线性表 数据结构 = 数据的逻辑结构+数据的存储结构+数据的运算 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-28ek7MfI-164242629 ...
- 数据结构与算法之线性表(超详细顺序表、链表)
原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 通过前面数据结构与算法基础知识我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容 ...
- Java数据结构和算法:线性表
线性表的定义 线性表(linear-list)是最常用最简单的一种数据结构.一个线性表是n (n≥0)个相同类型数据元素的有限序列.记为: L= (a1, a2 , - , an ). 其中,L是表名 ...
- C语言数据结构(大话数据结构——笔记1)数据结构绪论、算法、线性表
[C语言描述]<数据结构和算法> 说是这个教程是按照<大话数据结构>这本书来编写的:数据结构与算法经典书籍--大话数据结构(带配套源码) ↑废话太TM多了,换一个! [搞定数据 ...
- 数据结构和算法———P6 线性表
线性表 线性表(List): 由零个或多个数据元素组成的有限序列 关键: 首先他是一个序列,也就是说元素之间是有先来后到的 若元素存在多个,则第一个无前驱,最后一个无后继,其他元素都有且仅有一个前驱和 ...
最新文章
- 如何使用php将字符从全角转为半角
- P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】
- maya中英文对比_maya中英文对照表
- USACO-Section2.1 Hamming Codes(深度优先搜索)
- ik做尾巴摆动 maya_maya中使用节点做IK骨骼的拉伸
- 在vSphere 6.x vSAN数据存储上使用Oracle RAC(2121181)
- 800变频器故障代码_变频器通用故障码意义汇总讲解
- java对象的状态由什么表示_持久化层的Java对象可处于哪些状态?这些状态有哪些特征?...
- PCM音频设备的操作(转)
- R语言数据分析之一-《R语言下载及读取excel导入excel》
- OPPO对诺基亚发起5G专利侵权诉讼
- 微信公众号文章素材收集网站大盘点
- Introduction to Wireless LAN Measurements From 802.11a to 802. 11 ac
- Zynq Axidma linux下驱动axidmatest.c 驱动分析
- 图灵机器人:到基层去,做人工智能的开放平台
- 电脑音频没声音,静音
- 微信小程序(八)实战——加载图片images
- 【Vue知识点】——Vue2和Vue3的数据劫持
- ES6新语法及vue基础
- 急,求一个类似的ppt模板,感谢好人
热门文章
- ubuntu下搭建的lamp环境新建站点
- MemSQL分布式架构介绍(二)
- 不再为无限级树结构烦恼,且看此篇
- 码农们来一起讨论下数据库设计....
- windows服务应用--做个简单的定时调用EXE功能(笔记)
- ASP.NET(C#)备份还原数据库
- 【leetcode】二叉树的深度以及树是否平衡的问题
- 模块电源(二):电感式DC-DC升压器
- BZOJ 2005 2005: [Noi2010]能量采集 | 容斥原理
- spark sql 的性能调优