当前位置: 首页 > news >正文

leecode练习-数组-3.9

练习一:合并两个有序数组

1. 题目

 2. 思路

  • 将遍历后的数组存储在临时数组sorted中;
  • 使用双指针 p1、p2同时遍历两个数组;
  • 当p1等于nums1的size时,p1排序完成,从nums2中取元素;
  • 当p2等于nums2的size时,p2排序完成,从nums1中取元素;
  • 当p1、p2没遍历完,就比较两个数的大小,取较小的数;
  • 将当前比较出的最小值放入sorted数组的当前位置,并递增index
  • 将sorted拷贝到num1并复制数组

3. 代码

#include <vector>

class Solution 
{
public:
    void merge(std::vector<int>& nums1, int m, std::vector<int>& nums2, int n) 
    {
        int p1 = 0, p2 = 0; // 双指针分别指向两个数组的起始位置
        std::vector<int> sorted; // 存储排序完成后的数组
        sorted.resize(m + n); // 调整sorted的大小以容纳m+n个元素
        int cur; // 存储当前比较出的值
        int index = 0; // 新增索引用于记录sorted的位置

        // 遍历两个数组并排序
        while (p1 < m || p2 < n)
        {
            // 当 p1 == m 时,nums1的所有元素已经处理完毕,从nums2中取元素
            if (p1 == m)
                cur = nums2[p2++]; // 取nums2中的当前元素,并移动p2指针
            // 当 p2 == n 时,nums2的所有元素已经处理完毕,从nums1中取元素
            else if (p2 == n)
                cur = nums1[p1++]; // 取nums1中的当前元素,并移动p1指针
            // p1、p2都没遍历完,就比较两个数的大小
            else if (nums1[p1] < nums2[p2])
                cur = nums1[p1++]; // 如果nums1的当前元素较小,则取nums1的当前元素,并移动p1指针
            else 
                cur = nums2[p2++]; // 否则取nums2的当前元素,并移动p2指针

            sorted[index++] = cur; // 将当前比较出的最小值放入sorted数组的当前位置,并递增index
        }

        // 将sorted拷贝到num1
        for (int i = 0; i < m + n; ++i)
        {
            nums1[i] = sorted[i]; // 将sorted数组中的每个元素复制到nums1中
        }

4. 错误总结

  1. 忘记包含头文件
  2. vector中部分函数使用方法不熟悉,需要复习

练习2:移除元素

1. 题目

2. 思路

初始化

  • 获取原数组 nums 的大小 size
  • 创建一个与原数组大小相同的临时数组 erased,用于存储不等于 val 的元素。
  • 初始化一个计数器 k,用于记录新数组的有效长度。

遍历原数组

  • 使用一个循环遍历原数组 nums 中的每一个元素。
  • 对于每个元素,检查其是否等于 val

条件判断

  • 如果当前元素不等于 val,将其赋值给临时数组 erased 中的第 k 个位置,并将 k 增加 1。
  • 如果当前元素等于 val,则跳过该元素,继续下一个元素的检查。

替换原数组

  • 使用 swap 方法将原数组 nums 的内容替换为临时数组 erased 的内容。

返回结果

  • 返回计数器 k 的值,表示移除后的数组的新长度。

3. 代码

#include <vector>

class Solution 
{
public:
    int removeElement(std::vector<int>& nums, int val) 
    {
        int slow = 0; // 慢指针,指向新数组的末尾位置

        for (int fast = 0; fast < nums.size(); ++fast) // 快指针,遍历原数组
        {
            if (nums[fast] != val) // 如果当前元素不等于目标值val
            {
                nums[slow] = nums[fast]; // 将当前元素放到慢指针的位置
                ++slow; // 增加慢指针的位置
            }
        }

        return slow; // 返回新数组的有效长度
    }
};


4. 错误总结

  • 一次过

练习3:删除有序数组的重复项

1. 题目

 

2. 思路

  • 初始化

    • 首先检查数组是否为空。如果为空,直接返回 0。
    • 使用一个慢指针 j,初始值为 0,用于记录新数组的末尾位置。
  • 遍历数组

    • 使用一个快指针 i,从 0 开始遍历数组 nums
  • 条件判断

    • 对于每个元素 nums[i],检查其是否与 nums[j] 相等。
    • 如果 nums[i] 不等于 nums[j],说明遇到了一个新的唯一元素:
    • 将 nums[i] 赋值给 nums[j+1],并将慢指针 j 增加 1。
    • 如果 nums[i] 等于 nums[j],则跳过该元素,继续下一个元素的检查。
  • 返回结果

    • 最终 j + 1 的值即为移除后的数组的新长度。

3. 代码

#include <vector>

class Solution 
{
public:
    int removeDuplicates(std::vector<int>& nums) 
    {
        if (nums.empty()) return 0; // 如果数组为空,直接返回0

        int j = 0; // 慢指针,指向新数组的末尾位置

        for (int i = 0; i < nums.size(); ++i) // 快指针,遍历原数组
        {
            if (nums[i] != nums[j]) // 如果当前元素不等于慢指针所指的元素
            {
                nums[++j] = nums[i]; // 将当前元素放到慢指针的下一个位置,并移动慢指针
            }
        }

        return j + 1; // 返回新数组的有效长度
    }
};


4. 错误总结

  • 一次过

相关文章:

  • 慕慕手记项目日记 熟悉SQLAIChemy ORM框架 2025-3-5
  • 软件开发过程总揽
  • 利用LLMs准确预测旋转机械(如轴承)的剩余使用寿命(RUL)
  • 如何将本地已有的仓库上传到gitee (使用UGit)
  • UML面向对象建模与设计 读书笔记
  • Python 数据可视化创意分享:解锁数据之
  • PCIe协议之RCB、MPS、MRRS详解
  • Mysql配置文件My.cnf(my.ini)配置参数说明
  • 一周学会Flask3 Python Web开发-使用SQLAlchemy动态创建数据库表
  • Elastic:AI 会开始取代网络安全工作吗?
  • uniapp,自绘仪表盘组件(基础篇)
  • 【VUE】day01-vue基本使用、调试工具、指令与过滤器
  • js 网络安全 网络安全 hw
  • C++入门——引用
  • 【数据结构与算法】LeetCode: 动态规划
  • clion+arm-cm3+MSYS-mingw +jlink配置用于嵌入式开发
  • React基础之useMeno
  • LangChain4j集成AI大模型的两种方式
  • 前端循环:for、forEach、map 指南
  • [AtCoder Beginner Contest 396] F - Rotated Inversions
  • 天问二号探测器顺利转入发射区
  • 河南一县政府党组成员签订抵制违规吃喝问题承诺书,现场交给县长
  • 词条数量大幅扩充,《辞海》第八版启动编纂
  • 著名心血管病学专家李国庆教授逝世,享年63岁
  • 共建医学人工智能高地,上海卫健委与徐汇区将在这些方面合作
  • 杞支雅男评《1517》|放眼世界,立足德国