【数据结构初阶】顺序表三道经典算法题(详解+图例)

Hello!很高兴又见到你了~~~

看看今天要学点什么来充实大脑吧------

目录

1、移除元素

【思路+图解】

【总结】

2、删除有序数组中的重复项

【思路+图解】

【总结】

3、合并两个有序数组

【思路+图解】

【总结】

[至此结束,Show Time!](#至此结束,Show Time!)


1、移除元素

【思路+图解】

上面的例子第一个数是等于val,当不等于val 时可以自己试一下。新思路的时间复杂度为O(N),空间复杂度为O(N),结合思路我们尝试上代码:

cs 复制代码
int removeElement(int* nums, int numsSize, int val) 
{
    int src=0;
    int dst=0;
    while(src<numsSize)
    {
        if(nums[src]==val)
        {
            src++;
        }
        else
        {
            nums[dst++]=nums[src++];
            //src++;
            //dst++;
        }
    }
    return dst;
}

【总结】

通过把 src 指向的不等于 val 的数赋给 dst 指向的位置,实现把不等于 val 的数放到前面,而且刚好 dst 的值就是数组中不等于 val 的数据的个数,同时要注意循环的条件。

2、删除有序数组中的重复项

【思路+图解】

咱们直接上代码:

在图解第一个步骤中出现了重复赋值的情况。经过 dst +1 后,dst 指向的数据等于2,src 指向的数据也等于2,再把 src 指向数据的值赋给dst,这里出现了重复赋值,我们优化一下代码:

cs 复制代码
int removeDuplicates(int* nums, int numsSize) 
{
    int dst=0;
    int src=1;
    while(src<numsSize)
    {
        if(nums[dst]!=nums[src]&&++dst!=src)
        {
            nums[dst]=nums[src];
        }
        src++;
    }
    
    return dst+1;
}

【总结】

通过 src 遍历数组,如果与 dst 指向的数据相等就跳过,不相等就先 dst++,再赋给 dst 指向的位置,限制条件 src<数组长度。这种方法思路清晰!

3、合并两个有序数组

【思路+图解】

思路理清,上代码:

cs 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{
    int l1=m-1;
    int l2=n-1;
    int l3=m+n-1;

    while(l1>=0&&l2>=0)
    {
        if(nums1[l1]>nums2[l2])
        {
            nums1[l3--]=nums1[l1--];
        }
        else
        {
            nums1[l3--]=nums2[l2--];
        }
    }
    //出了while循环,要么l1<0,要么l2<0
    while(l2>=0)
    {
        nums1[l3--]=nums2[l2--];
    }
}

【总结】

妙!多理解理解,记住这种方法,悟一悟,反正我太菜想不到这种方法......


至此结束,Show Time!

完------

童话镇_小野来了_高音质在线试听_童话镇歌词|歌曲下载_酷狗音乐酷狗音乐为您提供由小野来了演唱的高清音质无损童话镇mp3在线听,听童话镇,只来酷狗音乐!https://t3.kugou.com/song.html?id=8Ceht83CPV2

相关推荐
CoovallyAIHub6 分钟前
一夜之间,大模型处理长文本的难题被DeepSeek新模型彻底颠覆!
深度学习·算法·计算机视觉
再睡一夏就好12 分钟前
【C++闯关笔记】STL:deque与priority_queue的学习和使用
java·数据结构·c++·笔记·学习·
天选之女wow12 分钟前
【代码随想录算法训练营——Day43(Day42周日休息)】动态规划——300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组
算法·leetcode·动态规划
金水谣29 分钟前
10.21
笔记
敲代码的嘎仔40 分钟前
JavaWeb零基础学习Day4——Maven
java·开发语言·学习·算法·maven·javaweb·学习方法
遇印记42 分钟前
网络运维学习笔记
数据结构·笔记·学习
梁辰兴1 小时前
企业培训笔记:外卖平台后端--套餐管理模块--回显套餐信息
笔记·vue·mybatis·springboot·外卖管理系统
四谎真好看1 小时前
Java 黑马程序员学习笔记(进阶篇20)
java·笔记·学习·学习笔记
聪明的笨猪猪1 小时前
hot 100 (1)—— 两数之和(哈希)
java·经验分享·算法·哈希算法
_dindong1 小时前
牛客101:链表
数据结构·c++·笔记·学习·算法·链表