【Leetcode&nowcode&数据结构】顺序表的应用

系列文章目录

《Leetcode&nowcode代码强化刷题》


文章目录


前言

数据结构与算法是计算机领域的核心,既是面试考察重点,也是优化项目性能的关键。而刷题是掌握它最有效的方式,能帮我们巩固理论、提升解题能力。​

我选择LeetCodeNowCode 作为主要刷题平台:LeetCode 题目丰富、分类清晰,适合夯实基础;NowCode 贴近国内企业笔试场景,助力对接实战需求,二者互补性强。​

这份刷题记录不只是题目与答案的罗列,更会记录解题思路、难点易错点,以及解法优化过程。希望它能成为我的复盘工具,也为其他学习者提供参考。​

接下来,就从第一道题开始,在刷题中积累提升,让数据结构与算法成为解决问题的有力工具。


正文


一.移除元素

题目链接27.移除元素
题目描述:


题目分析

这道题目的意思是,给我们一个数组和一个值val,让我们删除所有数组中所有等于val的数据,并且返回剩下的元素个数k
思路讲解 :

首先,我们最容易想到的

我们重新创建一个新数组,遍历原数组,把所有不为val的值放入新数组,遍历完之后,让新数组覆盖原数组,这个方法时间和空间复杂度都是O(n)

除此之外,我们还可以用双指针法来解决这道题目

我们可以先创建两个变量srcdst先都为0

如果src所在位置元素等于valsrc++继续向后找

如果src所在位置元素不等val,就把这个值赋dst所在位置dstsrc都++

由于src++的情况更多,所以一定是它最先走完

这时候我们dst所在位置,就是我们的k

代码展示

c 复制代码
int removeElement(int* nums, int numsSize, int val) {
    // 双指针
    // 定义一个dst和src
    // src找不是val的就和给dst,两个都向后
    // 是,src继续向后找
    int src = 0;
    int dst = 0;
    // src小于元素个数的时候,循环继续
    while (src < numsSize) {
        if (nums[src] != val) {
            nums[dst++] = nums[src++];

        } else {
            src++;
        }
    }
    return dst;
}

题解链接https://leetcode.cn/problems/remove-element/solutions/3808953/lian-biao-wei-cha-by-strange-spencezvf-3rbl/


二.删除有序数组中的重复项

题目链接26.删除有序数组中的重复项
题目描述:

题目分析

题目意思就是让我们删除数组中重复的元素,并且返回删除后数组的元素个数k
思路讲解 :

同样的,我们还是可以开辟新数组

但是参考第一道题目,我们可以思考使用双指针

只不过,现在我们让src=1dst=0

如果dst==src,我们src++向后

如果dst!=src,我们dst++向后,src赋给我们的dstsrc再向后++

但是我们dst可能和src会指向同一个位置,这样赋值就多余了,所以这种情况,我们也不赋值

但是这里最后,我们返回的要是dst+1
代码展示

c 复制代码
int removeDuplicates(int* nums, int numsSize) {
    // 方法二
    // 双指针
    int src = 1;
    int dst = 0;
    // src==dst,src++;
    // src!=dst,src++赋值dst ++
    while (src < numsSize) {
        if (nums[src] != nums[dst] && ++dst != src) {
            nums[dst] = nums[src];
        }
        src++;
    }

    return dst + 1;
}

题解链接https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/3808974/shuang-zhi-zhen-by-strange-spencezvf-22zw/


三.合并两个有序数组

题目链接88.合并两个有序数组
题目描述:

题目分析

这道题目让我们按照非递减的顺序,合并两个数组

有题目意思可以知道,其实就是合并到第一个数组
思路讲解 :

首先,第一个方法,我们直接把两个数组合并,然后用排序算法排序,可是时间复杂度可能比较大

我们想第二种方法,就是从小到大遍历·比较两个数组的数据,直接在第一个数组上进行放置,但是这个方法会覆盖没有比较的元素

这时候我们发现,第一个数组在原来的空间上已经给我们开辟好了n+m个位置,我们可以反过来,从大往小去排,这样即便我们总是放入的是第二数组数据,我们还是可以不覆盖任何一个元素

我们先定义三个变量,分别指向下面的这三个位置

比较l1l2的值,在l3位置进行插入

当其中一个数组遍历完之后,再把剩下的元素依次插入,这样就可以实现数组的顺序合并了
代码展示

c 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    // 依次比较两个数组中的元素大小,
    // 从大往小放
    int l1 = m - 1;
    int l2 = n - 1;
    int l3 = n + m - 1;
    while (l1 >= 0 && l2 >= 0) {
        // 比较
        if (nums1[l1] > nums2[l2]) {
            nums1[l3--] = nums1[l1--];
        } else {
            nums1[l3--] = nums2[l2--];
        }
    }
    while (l2 >= 0) // l1先结束,继续放nums2的数据
    {
        nums1[l3--] = nums2[l2--];
    }
}

题解链接https://leetcode.cn/problems/merge-sorted-array/solutions/3809009/shu-zu-de-he-bing-by-strange-spencezvf-exe7/


总结

顺序表部分的题目,代码思维相对适中,但是其中也不缺乏一些技巧性的东西,我们需要勤加练习,反复理解

下一篇我会为大家带来栈和队列相关的题目,希望大家可以多多支持,有什么问题可以评论留言或者后台私信,感谢大家

相关推荐
一水鉴天4 小时前
整体设计 逻辑系统程序 之27 拼语言整体设计 9 套程序架构优化与核心组件(CNN 改造框架 / Slave/Supervisor/ 数学工具)协同设计
人工智能·算法
小年糕是糕手4 小时前
【数据结构】双向链表“0”基础知识讲解 + 实战演练
c语言·开发语言·数据结构·c++·学习·算法·链表
将车2444 小时前
C++实现二叉树搜索树
开发语言·数据结构·c++·笔记·学习
NiKo_W5 小时前
Linux 线程控制
linux·数据结构·内核·线程·进程·线程控制
PyHaVolask5 小时前
数据结构与算法分析
数据结构·算法·图论
小王C语言5 小时前
封装红黑树实现mymap和myset
linux·服务器·算法
幸运小圣5 小时前
Set数据结构【ES6】
javascript·数据结构·es6
大佬,救命!!!5 小时前
算法实现迭代2_堆排序
数据结构·python·算法·学习笔记·堆排序
Dream it possible!6 小时前
LeetCode 面试经典 150_栈_简化路径(53_71_C++_中等)(栈+stringstream)
c++·leetcode·面试·