好题分析(2023.10.29——2023.11.04)

news2024/11/27 11:33:03

目录

​编辑

前情回顾:

前言:

题目一:《合并两个有序数组》

1.运用qsort 

2.利用三指针 

题目二:《移除链表元素》 

题目三:《链表的中间节点》 

总结:


前情回顾:

我们在上一篇好题分析中,分析了以下几题:

《消失的数字》《轮转数组》《移除元素》《删除有序数组的重复项》关于时间复杂度的好题分析

上一篇的好题分析的blog在

好题分享(2023.10.22——2023.10.28)-CSDN博客

前言:

本次好题分享,我们将一起来手撕以下三道题,两道关于链表的新内容题,还有一道关于顺序表的题目,接下来让我们手撕!

题目一:《合并两个有序数组》

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

对于该题目,我们给出两种解法。

1.运用qsort 

int cmp(int* a, int* b) {
    return *a - *b;
}

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    for (int i = 0; i != n; ++i) {
        nums1[m + i] = nums2[i];
    }
    qsort(nums1, nums1Size, sizeof(int), cmp);
}

对于该种算法还是较好理解的,先将nums2中的元素放在nums1中,此时我们需要将nums2中的元素放在nums1最后一个元素后面。

放置完后我们再利用qsort排序,此时时间复杂度为O((m+n)log(m+n)) 

2.利用三指针 

 

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int i1 = m-1;
    int i2 = n-1;
    int j = m+n-1;
    while(i1>=0 && i2>=0)
    {
        if(nums1[i1] > nums2[i2])
        {
            nums1[j--] = nums1[i1--];
        }
        else
        {
            nums1[j--] = nums2[i2--];
        }
    }
    
    while(i2>=0)//i1走完,i2还没走完
    {
        nums1[j--] = nums2[i2--];
    }

}

 对于该种算法,我们利用的是三个指针来进行覆盖操作

我们先要来比较i1和i2,谁大,谁就覆盖到j上,同时i1/i2和j同时--。

再接下来,3<5,继续覆盖i2。

 

这时候i1指向的3,则大于i2所指向的2了。所以j被i1覆盖,再同时--。

后面以此类推,我不在这过多赘述了。

但是要注意的是!

如果是以下这种情况:

 

这个时候,毫无疑问i1将会一直走,直到。

 

这个时候,我们就一定要将i2剩下的值,再一个个拷贝进去。这样才是正确答案!

这种时间复杂度为O(N) 

题目二:《移除链表元素》 

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

本题目和下一道题均是在链表上进行算法实现,如果你不懂链表,可以在看完下一篇blog,关于《单链表》的再听一遍。这样便可以更高效的听懂关于本题目的讲解。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* prev = NULL;
    struct ListNode* cur = head;

    while(cur)
    {
        if(cur->val == val)
        {
            struct ListNode* next = cur->next;
            free(cur);
            if(prev)
            {
                prev->next = next;
            }
            else{
                head = next;
            }
            cur = next;
        }
        else{
            prev = cur;
            cur = cur->next;
        }
    }
    return head;
}

本算法是利用双指针来进行操作,具体实现方法如下:

我们让cur指针先指向头结点,再遍历cur指针,直到cur->val == val,就释放掉该结点

要注意的是后面的val是我们要删掉的值,前面的val是该结点的数据域。

 我们在释放掉cur指向的结点前,一定要再创建一个指针,要指向下一个结点的地址,不然释放该节点后,就会找不到下一个结点的地址。

所以如图所示:

 

再将prev指向的节点的指针域指向next指向结点的指针域。

如此不断往复,就可以得到链表最后的样子。

但是!!

我们一定要想到一种情况,那就是当头节点就是我们要删除的值时,又该是怎么样的处理方式?

即:

 

这种情况就是prev == NULL的时候,意思就是要删除首结点。

那么这个时候,还是一样,创建指针next指向cur下一个结点。

但是这里在free(cur)的时候,还需要将head指向next指向的结点。

意为新的头结点。

 

如此一来,才是完整的代码。

 时间复杂度为O(N)

 

题目三:《链表的中间节点》 

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode* slow = head, *fast = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    return slow;
}

 这里我们引入一种新算法,也是一种新武器。

“快慢指针”

首先我们先创建两个指针,fast和slow。

fast一次走两步。

slow一次走一步。

再来一次循环

 同时我们要满足,当fast->next == NULL时就要停下,此时停下后,slow的值就是我们需要的中间节点。

还有一种情况

 

 

当fast == NULL时,此时停下后,slow的值就是我们需要的中间值。 

如此一来,就是快慢指针理解的全解析了。

时间复杂度为O(N)

总结:

本次好题分析,我们仅仅讲了三道算法题,难度不大,但是对于我们初学却是一些很有意义的题目,同时也具备很重的含金量,希望大家下来可以多多复习复习。

也可以复习上一篇的好题分享:

好题分享(2023.10.22——2023.10.28)-CSDN博客

记住“坐而言不如起而行”

Action speak louder than words!

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

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

相关文章

【图】:常用图搜索(图遍历)算法

目录 概念图遍历深度优先搜索 (DFS)DFS 适用场景DFS 优缺点 广度优先搜索 (BFS)BFS 适用场景BFS 优缺点 DFS & BFS 异同点 图搜索Dijkstra算法A*算法Floyd算法Bellman-Ford算法SPFA算法 概念 图遍历和图搜索是解决图论问题时常用的两种基本操作。 图遍历是指从图中的某一个…

Spring Cloud分布式缓存

目录 单点Redis Redis数据持久化 RDB持久化 bgsave细节 RDB的缺点 AOF持久化 AOF的问题 RDB与AOF对比 搭建Redis主从架构 数据同步原理 全量同步 增量同步 主从同步优化 Redis哨兵 集群检测 选举主节点 故障转移 搭建哨兵集群 RedisTemplate的哨兵模式 单点…

【Leetcode】【每日一题】【中等】187. 重复的DNA序列 官方题解待更新

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/repeated-dna-sequences/descrip…

C++ AVL树 c语言版本

引入平衡树 假设我们有两个节点&#xff1a;当我们插入第三个节点&#xff0c;就失衡了&#xff1a;此刻我们就要把它平衡一下。 为什么要变平衡 为什么说它失衡了呢&#xff0c;又为什么要把它变平衡&#xff1f; 如图a&#xff0c;假设我们要查找30这个节点就要查3次才能…

耳机,耳麦,傻傻分不清,难怪麦克风没有声音

有时候会发现为什么同一根耳机线&#xff0c;插到笔记本上可以同时说话和收音&#xff0c;但是插到台式机就不行呢&#xff1f; 因为在以前&#xff0c;耳机和麦克风的接口都是独立的&#xff08;如上图&#xff09;。现在笔记本为了方便&#xff0c;就普遍使用了二合一接口&a…

正点原子嵌入式linux驱动开发——Linux 网络设备驱动

网络驱动是linux里面驱动三巨头之一&#xff0c;linux下的网络功能非常强大&#xff0c;嵌入式linux中也常常用到网络功能。前面已经讲过了字符设备驱动和块设备驱动&#xff0c;本章就来学习一下linux里面的网络设备驱动。 嵌入式网络简介 嵌入式下的网络硬件接口 本次笔记…

是时候放弃 Java 序列化了

基本概念 Java 序列化和反序列化三连问&#xff1a; 什么是 Java 序列化和反序列化&#xff1f;为什么需要 Java 序列化和反序列化&#xff1f;如何实现 Java 序列化和反序列化&#xff1f; 是什么 一句话就能够说明白什么是 Java 序列化和反序列化&#xff1f;Java 序列化…

【探索Linux】—— 强大的命令行工具 P.13(文件系统 | 软硬链接 | 动态库和静态库)

阅读导航 引言一、文件系统1. 磁盘文件系统2. 磁盘结构&#xff08;1&#xff09;物理结构&#xff08;2&#xff09;存储结构 3. stat 命令4. Linux ext2文件系统 二、软硬链接1. 软连接2. 硬链接 三、动态库和静态库1. 动态库&#xff08;1&#xff09;动态库文件扩展名&…

计算虚拟化1——CPU虚拟化

目录 vCPU的概念 vCPU和CPU的关系 CPU的Ring级别 CPU虚拟化技术 软件辅助全虚拟化 半虚拟化 硬件辅助虚拟化 计算资源的虚拟化可以分为CPU虚拟化、内存虚拟化、I/O虚拟化三个方面 CPU虚拟化&#xff1a;多个虚拟机共享CPU资源&#xff0c;对虚拟机中的敏感指令进行截获…

【JavaSE】基础笔记 - 类和对象(上)

目录 1、面向对象的初步认知 1.1、什么是面向对象 1.2、面向对象与面向过程 2. 类定义和使用 2.1、简单认识类 2.2、类的定义格式 2.3、自定义类举例说明 2.3.1、定义一个狗类 2.3.2、定义一个学生类 3、类的实例化 3.1、什么是实例化 3.2、类和对象的说明 1、面向…

MySQL性能优化的最佳20条经验

概述 关于数据库的性能&#xff0c;这并不只是DBA才需要担心的事。当我们去设计数据库表结构&#xff0c;对操作数据库时(尤其是查表时的SQL语句)&#xff0c;我们都需要注意数据操作的性能。下面讲下MySQL性能优化的一些点。 1. 为查询缓存优化你的查询 大多数的MySQL服务器…

Python基础入门例程47-NP47 牛牛的绩点(条件语句)

最近的博文&#xff1a; Python基础入门例程46-NP46 菜品的价格&#xff08;条件语句&#xff09;-CSDN博客 Python基础入门例程45-NP45 禁止重复注册&#xff08;条件语句&#xff09;-CSDN博客 Python基础入门例程44-NP44 判断列表是否为空&#xff08;条件语句&#xff0…

ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索

一、Attachment 介绍 Attachment 插件是 Elasticsearch 中的一种插件&#xff0c;允许将各种二进制文件&#xff08;如PDF、Word文档等&#xff09;以及它们的内容索引到 Elasticsearch 中。插件使用 Apache Tika 库来解析和提取二进制文件的内容。通过使用 Attachment 插件&a…

redis数据库缓存服务器(基础命令)

redis比mysql访问数据快 非关系型数据库以键值对的方式存储数据 作用&#xff1a;加快访问速度&#xff0c;缓解数据库压力 redis最新版本7 特点 丰富的数据结构 list,set,hash等数据结构的存储 支持持久化 支持事务 “一个完整的动作&#xff0c;要么全部执行&#xff0…

数据结构:AVL树讲解(C++)

AVL树 1.AVL树的概念2.平衡因子3.节点的定义4.插入操作5.旋转操作&#xff08;重点&#xff09;5.1左单旋5.2右单旋5.3左右双旋5.4右左双旋 6.一些简单的测试接口7.完整代码 1.AVL树的概念 普通二叉搜索树&#xff1a;二叉搜索树 二叉搜索树虽可以缩短查找的效率&#xff0c;但…

D-Link监控账号密码信息泄露

访问漏洞的 url 为 /config/getuser?index0其中泄露了账号密码 使用泄露的账号密码登陆系统 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的…

CCF-CSP真题《202309-3 梯度求解》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202309-3试题名称&#xff1a;梯度求解时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 背景 西西艾弗岛运营公司近期在大力推广智能化市政管理系…

文本生成评估指标简单介绍BLEU+ROUGE+Perplexity+Meteor 代码实现

以下指标主要针对两种&#xff1a;机器翻译和文本生成&#xff08;文章生成&#xff09;&#xff0c;这里的文本生成并非是总结摘要那类文本生成&#xff0c;仅仅是针对生成句子/词的评价。 首先介绍BLEU&#xff0c;ROUGE, 以及BLEU的改进版本METEOR&#xff1b;后半部分介绍P…

volatile-禁重排案例详解

在每一个volatile写操作前面插入一个StoreStore屏障--->StoreStore屏障可以保证在volatile写之前&#xff0c;其前面所有的普通写操作都已经刷新到主内存中。 在每一个volatile写操作后面插入一个StoreLoad屏障--->StoreLoad屏障的作用是避免volatile写与后面可能有的vo…

【Qt之QtXlsx模块】安装及使用

1. 安装Perl&#xff0c;编译QtXlsx源码用 可以通过命令行进行查看是否已安装Perl。 下载及安装传送门&#xff1a;链接: https://blog.csdn.net/MrHHHHHH/article/details/134233707?spm1001.2014.3001.5502 1.1 未安装 命令&#xff1a;perl --version 显示以上是未安装…