【顺序表习题|图解|双指针】合并两个有序数组 + 训练计划 I


🌈个人主页:聆风吟_
🔥系列专栏:数据结构手札・刷题篇
🔖少年有梦不应止于心动,更要付诸行动。


文章目录

  • 📚专栏订阅推荐
  • [一. ⛳️合并两个有序数组](#一. ⛳️合并两个有序数组)
    • [1.1 题目](#1.1 题目)
    • [1.2 示例](#1.2 示例)
    • [1.3 限制](#1.3 限制)
    • [1.4 解题思路](#1.4 解题思路)
  • [二. ⛳️训练计划 I](#二. ⛳️训练计划 I)
    • [2.1 题目](#2.1 题目)
    • [2.2 示例](#2.2 示例)
    • [2.3 限制](#2.3 限制)
    • [2.4 解题思路](#2.4 解题思路)
  • 📝结语

📚专栏订阅推荐

专栏名称 专栏简介
C++藏宝阁 本专栏聚焦学习阶段核心知识点,深耕基础与实战,干货笔记持续更新,和大家共学共进,夯实编程功底。
数据结构手札 本专栏主要是我的数据结构入门学习手札,记录个人从基础到进阶的学习总结。
数据结构手札・刷题篇 本专栏是《数据结构手札》配套习题讲解,通过练习相关题目加深对算法理解。

一. ⛳️合并两个有序数组

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

1.1 题目

给你两个按非递减顺序 排列的整数数组nums1nums2,另有两个整数 mn ,分别表示nums1nums2中的元素数目。请你合并 nums2nums1中,使合并后的数组同样按非递减顺序排列。

注意: 最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

1.2 示例

输入: nums1 = 1, 2, 3, 0, 0, 0 , m = 3, nums2 = 2, 5, 6 , n = 3
输出: 1, 2, 2, 3, 5, 6

1.3 限制

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1i, nums2j <= 109

1.4 解题思路

双指针

1.初始化: 定义三个指针end1,end,end2分别指向数组num1的有效元素的位置、以及num1和num2的最后位置。

2.循环:

  • 如果nums1end1 > nums2end2,执行nums1[end--] = nums2[end2--]
  • 如果nums1end1 <= nums2end2,执行nums1[end--] = nums1[end1--]
  • 如果end1 或 end2 其中一个小于0,循环终止。

3.判断end2是否小于零:

  • 如果为小于零,不进行任何操作;
  • 如果大于等于零,将nums2中的剩余的元素压入nums1中。

c语言代码:

c 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    //初始化
    int end = m + n -1;
    int end1 = m -1;
    int end2 = n - 1;

    //循环
    while(end1 >= 0 && end2 >= 0)
    {
        if(nums1[end1] > nums2[end2])
        {
            nums1[end--] = nums1[end1--];
        }
        else
        {
            nums1[end--] = nums2[end2--];
        }
    }

    //判断end2的值
    while(end2 >= 0)
    {
        nums1[end--] = nums2[end2--];
    }
}

二. ⛳️训练计划 I

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

2.1 题目

教练使用整数数组 actions 记录一系列核心肌群训练项目编号。为增强训练趣味性,需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组 形式返回。

2.2 示例

输入: actions = 1, 2, 3, 4, 5
输出: 1, 3, 5, 2, 4
解释: 正确答案不为一

2.3 限制

  • 0 <= actions.length <= 50000
  • 0 <= actionsi <= 10000

2.4 解题思路

采用双指针

定义双指针 leftright 分别位于数组的两端,循环执行:

  1. 指针 left 从左向右寻找偶数;
  2. 指针 right 从右向左寻找奇数;
  3. 将指针 left 找到的偶数与指针 right 找到的奇数进行交换。

c语言代码:

c 复制代码
// 交换函数
void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int* trainingPlan(int* actions, int actionsSize, int* returnSize) {
    int l = 0;      // 左指针
    int r = actionsSize - 1; // 右指针

    while (l < r)
    {
        while (l < r && actions[l] % 2 != 0)
            l++; // 从左向右找首个偶数
        while (l < r && actions[r] % 2 == 0)
            r--;                      // 从右向左找首个奇数
        swap(&actions[l], &actions[r]); // 交换
    }

    // 设置返回数组长度
    *returnSize = actionsSize;
    return actions;
}

c++代码:

cpp 复制代码
class Solution {
public:
    vector<int> trainingPlan(vector<int>& actions) {
        int sz = actions.size();

        int l = 0;//左指针
        int r = sz -1;//右指针
        while(l < r){
            while(l < r && actions[l] % 2 != 0) l++;//从左向右找首个偶数
            while(l < r && actions[r] % 2 == 0) r--;//从右向左找首个奇数
            swap(actions[l], actions[r]);//交换
        }

        return actions;
    }
};

📝结语

     今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟_的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!

相关推荐
凡人叶枫2 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp2 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的2 小时前
C++纯虚函数
开发语言·c++·网络安全
程序员二叉3 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
郭泽斌之心3 小时前
MQL5 EA 怎么和外部程序通信?文件三件套协议:参数热更新不重启、状态心跳、远程触发
人工智能·经验分享·深度学习·ea·fay数字人·easydeal
青山木3 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
徐小夕3 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
凡人叶枫3 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
北域码匠4 小时前
SHA-1算法:安全哈希原理与应用解析
算法·c#·哈希算法
努力小周4 小时前
STM32智能安防系统
c语言·stm32·单片机·嵌入式硬件·物联网·计算机网络·pcb工艺