顺序表(LeetCode)

个人主页流年如梦

专栏《C语言》 《数据结构》

文章目录

一.移除元素

点击转跳👈

原题:

🧐思路 :用双指针法 ,用一个快指针 遍历整个数组,检查每个元素是否等于val,再用一个慢指针 记录下一个有效元素应该存放的位置;当快指针遇到不等于val的元素时,将其赋值给慢指针位置,然后慢指针向后移动;当遍历结束后,慢指针的位置就是k,直接返回即可

参考代码如下

c 复制代码
int removeElement(int* nums, int numsSize, int val) {
    int slow = 0;
    for (int fast = 0; fast < numsSize; fast++) {
        if (nums[fast] != val) {
            nums[slow] = nums[fast];
            slow++;
        }
    }
    return slow;
}

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

点击转跳👈

原题:

🧐思路 :这道题和上一题的思路非常相似,依旧用双指针法;让慢指针slow指向当前唯一元素的末尾位置,快指针fast遍历数组,寻找与前一个元素不同的新元素;当nums[fast] != nums[slow]时,说明遇到了新的唯一元素,将其赋值给nums[slow+1],然后slow++;当遍历结束后,slow+1就是数组去重后的长度

参考代码如下

c 复制代码
int removeDuplicates(int* nums, int numsSize) {
    if (numsSize == 0) {
        return 0;
    }
    int slow = 0;
    for (int fast = 1; fast < numsSize; fast++) {
        if (nums[fast] != nums[slow]) {
            slow++;
            nums[slow] = nums[fast];
        }
    }
    return slow + 1;
}

三.合并两个有序数组

点击转跳👈

原题:

🧐思路 :这道题与上面两道不同,最优解法要用逆序双指针法(从后往前比) ;拿两个数组末尾的元素比较,谁大就先放到nums1的最后面;一直往前比,直到其中一个数组处理完;如果nums2还有剩下的元素,直接复制到nums1前面就行(nums1剩下的不用管,本来就有序)

参考代码如下

c 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int p1 = m - 1;
    int p2 = n - 1;
    int p = m + n - 1;
    while (p1 >= 0 && p2 >= 0) {
        if (nums1[p1] > nums2[p2]) {
            nums1[p] = nums1[p1];
            p1--;
        } else {
            nums1[p] = nums2[p2];
            p2--;
        }
        p--;
    }
    while (p2 >= 0) {
        nums1[p] = nums2[p2];
        p2--;
        p--;
    }
}

🎯总结

原地数组操作优先考虑双指针 ,快指针遍历筛选,慢指针记录有效位置;有序数组合并优先逆序双指针,避免元素被覆盖

👀 关注 我们一路同行,从入门到大师,慢慢沉淀、稳步成长
❤️ 点赞 鼓励原创,让优质内容被更多人看见
⭐ 收藏 收好核心知识点与实战技巧,需要时随时查阅
💬 评论 分享你的疑问或踩坑经历,一起交流避坑、共同进步

相关推荐
专注仿真10 分钟前
Spring AI 实现智能对话系统项目指南
数据结构·spring·机器学习
布莱克6051 小时前
数组详解:定义、作用、应用场景及与链表的区别(C/C++ 代码讲解)
c语言·开发语言·c++·数组
间歇性努力持续性发呆的野生快乐选手1 小时前
高级数据结构:树状数组
数据结构
hongmai6668881 小时前
MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处
c语言·开发语言·arm开发·单片机·5g
多弗朗皮卡丘1 小时前
C语言梦开始的地方19:文件操作
c语言·开发语言
万法若空2 小时前
C/C++ 类型别名定义方式对比
java·c语言·c++
血小板要健康3 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
一直C4 小时前
Linux系统编程|进程间通信IPC全套详解(1)(管道、信号)
linux·c语言·开发语言·网络·青少年编程·visual studio code
春风解人意5 小时前
从零开始学习嵌入式P28----线程
c语言·学习·算法
luj_17685 小时前
合法避税与投资评估实战指南
c语言·开发语言·网络·经验分享·算法