静态顺序表【数组】有关的三道OJ题

系列文章目录

🎈 🎈 我的优快云主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集C语言初阶合集,希望能帮到你!!!😍 😍
🔍🔍我的C语言进阶合集我的C语言进阶合集,期待你的点击!!!🌈🌈
🎉🎉我的数据结构与算法合集数据结构与算法合集,点进去看看吧!!! 🎊🎊


前言

各位博友,大家好!👋 今天为大家送上静态顺序表【数组】有关的三道OJ题的总结。🔍


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

下面是该题的链接🔗

删除有序数组中的重复项

解题思路

通过 双指针法 来移除数组中的重复元素。
src指针用于遍历数组,dst指针用于记录不重复元素的位置。
如果src指向的元素与dst指向的元素不同,则将src的元素复制到dst + 1的位置,并移动dst指针。
这样,所有不重复的元素都会被移动到数组的前部。
最后返回dst + 1,即数组中不重复元素的数量。
这种方法的时间复杂度为O(numsSize),空间复杂度为O(1)。

代码展示

int removeDuplicates(int* nums, int numsSize) 
{
    // 如果数组为空或只有一个元素,则无需去重,直接返回数组大小
    if (numsSize == 0 || numsSize == 1) 
    {
        return numsSize;
    }

    int src = 1; // src 是源索引,从数组的第二个元素开始
    int dst = 0; // dst 是目标索引,初始化为数组的第一个元素

    // 遍历数组,从第二个元素开始
    while(src < numsSize) 
    {
        // 如果当前元素与目标索引处的元素不同,则将当前元素复制到目标索引的下一个位置
        if(nums[src] != nums[dst]) 
        {
            nums[++dst] = nums[src]; // 复制元素,并更新目标索引
        }
        ++src; // 移动源索引到下一个元素
    }

    // 数组中唯一元素的个数返回,dst 是最后一个唯一元素的索引,所以返回 dst + 1
    return (dst + 1);    
}

二、移除元素

下面是该题的链接🔗,想尝试的博友,点击下面的链接就能大展身手了哦🥳。

移除元素

解题思路

通过一次遍历数组来移除所有等于val的元素。
src指针用于遍历数组,dst指针用于记录不等于val的元素的位置。
如果src指向的元素不等于val,则将该元素复制到dst指向的位置,并移动dst指针。
这样,所有不等于val的元素都会被移动到数组的前部。
最后返回dst,即数组中不等于val的元素的数量。
这种方法的时间复杂度为O(numsSize),空间复杂度为O(1)。

代码展示

int removeElement(int* nums, int numsSize, int val) 
{
    int src = 0; // src 是源索引,用于遍历数组
    int dst = 0; // dst 是目标索引,用于记录不等于 val 的元素的位置

    // 遍历数组中的每个元素
    while(src < numsSize) 
    {
        // 如果当前元素不等于 val,则将其复制到 dst 指向的位置
        if(nums[src] != val) 
        {
            nums[dst] = nums[src]; // 复制元素
            ++dst; // 移动目标索引到下一个位置
        }
        ++src; // 移动源索引到下一个元素
    }

    // 返回 dst,即数组中不等于 val 的元素的数量
    return dst;
}

三、合并两个有序数组

下面是该题的链接🔗

合并两个有序数组

解题思路

首先比较nums1nums2中较大的元素,并将较大的元素放到nums1的末尾。
如果nums2中还有剩余元素,将它们全部拷贝到nums1的前面。
合并过程是从后向前进行的,这样可以避免覆盖nums1中未处理的元素。
这种方法的时间复杂度为O(m+n),空间复杂度为O(1)。

代码展示

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{
    // end1 是 nums1 中从后向前遍历的索引,m 是 nums1 中已经排序部分的元素个数
    int end1 = m - 1;
    // end2 是 nums2 中从后向前遍历的索引,n 是 nums2 中元素的个数
    int end2 = n - 1;
    // dst 是 nums1 中从后向前遍历的索引,用于存放合并后的元素
    int dst = m + n - 1;

    // 合并两个数组,直到 end1 或 end2 遍历完
    while((end1 >= 0) && (end2 >= 0)) 
    {
        // 如果 nums1 中的当前元素大于 nums2 中的当前元素,则将 nums1 中的元素放入 nums1 的末尾,并移动指针
        if(nums1[end1] > nums2[end2]) 
        {
            nums1[dst--] = nums1[end1--];
        } 
        else 
        {
            // 否则,将 nums2 中的元素放入 nums1 的末尾,并移动指针
            nums1[dst--] = nums2[end2--];
        }
    }
    // 如果 nums2 中还有剩余元素,则将它们全部拷贝到 nums1 的前面
    while(end2 >= 0) 
    {
        nums1[dst--] = nums2[end2--];
    }
}

END

每天都在学习的路上!
On The Way Of Learning

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OTWOL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值