ACM金牌选手算法讲解《线性表》

哈喽,大家好,我是编程熊,双非逆袭选手,字节跳动、旷视科技前员工,ACM亚洲区域赛金牌,保研985研究生,分享算法与数据结构、计算机学习经验,帮助大家进大厂~

文章首发于: ACM金牌选手算法讲解《线性表》!戳这里!

线性表

LeetCode刷题过程中,常常用到的线性表主要包括以下四个重要的数据结构: 数组、链表、栈、队列。

下面将分别讲解数组、链表、栈和队列。

线性表概述

线性: 这里的线性是逻辑上的连续,而非物理存储的连续。

存储的数据: 线性表是一个有n个相同类型数据的有序序列。

数组array

介绍

数组是物理存储连续的线性表,其常见的形式为 a[0]、a[1] ... a[n-1]a[i-1]a[i] 的前驱,a[i+1]a[i] 的后继。

image

基本操作

插入

插入元素,要将插入位置后的元素全部向后移动一位。

下图以数组长度为6,数据为0、1、2、3、4、5,在位置3插入一个元素X举例。

image
删除

删除元素,要讲删除位置后的元素全部向前移动一位。

下图以数组长度为6,数据为0、1、2、3、4、5,删除位置3上的元素X举例。

image
反转

翻转数组,本质是将数组存储的数据进行反转。

下图以数组长度为6,数据为0、1、2、3、4、5,反转整个数组举例。

image

例题

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. 搜索插入位置

链表

介绍

链表的出现是为了解决数组插入、删除带来的线性开销。

区别于数组,链表中的元素可以不连续存储,每一个元素包含该 元素的数据指向链表下一个节点的指针

image

基本操作

插入

插入元素,要将插入元素前一个位置的指针指向插入元素本身,将插入元素的指针指向前一个位置。

image
删除

删除元素,要将 删除元素前一个元素的指针 指向 删除元素后一个元素,代码实现上需要将 删除元素指针指向的位置 记录下来。

下图是以长度为5的链表,删除位置3上的元素为例子。

image
翻转

翻转链表,可以一边遍历一边用一个临时变量记录当前元素的下一个元素指针所指向的位置,然后再将当前元素的下一个元素指针指向自己。

下图是以长度为5的链表,翻转链表为例子。

image

例题

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;
}

习题推荐

  1. LeetCode237. 删除链表中的节点
  2. LeetCode 21. 合并两个有序链表
  3. LeetCode 160. 相交链表

栈和队列

栈介绍

栈被限定必须在栈顶进行插入和删除操作,因此其特点为是后进先出

下图是栈的插入(入栈)、删除(出栈)示意图。

image

队列介绍

队列被限定在队头进行删除操作,队尾进行插入操作,因此其特点为先进先出

下图是队列的插入(入队)、删除(出队)示意图。

image

基本操作

栈和队列的插入和删除操作上图已解释。

例题

LeetCode 155. 最小栈

题意
设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

  • 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

我是编程熊,双非逆袭选手,字节跳动、旷视科技前员工,ACM亚洲区域赛金牌,保研985研究生,分享算法与数据结构、计算机学习经验,帮助大家进大厂~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容