首页 > 编程语言 >数组类算法题——合并非递减数组

数组类算法题——合并非递减数组

时间:2023-11-16 23:12:39浏览次数:37  
标签:int 合并 算法 数组 tempFromEndIndex 递减 nums1 nums2

合并非递减数组

题目:

给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2nums1 中,使合并后的数组同样按 非递减顺序 排列。

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

比如:{1,2,2,3,4},{2,3,3}合并为:{1,2,2,2,3,3,3,4}

代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int nums1FromEndIndex         = m-1;
    int nums2FromEndIndex         = n-1;
    int tempFromEndIndex   = 0;
    for(tempFromEndIndex = m+n-1;tempFromEndIndex>=0;tempFromEndIndex--)
    {
        if(nums2FromEndIndex<0)
        {
            break;
        }
        if(nums1FromEndIndex<0)
        {
            nums1[tempFromEndIndex] = nums2[nums2FromEndIndex];
            nums2FromEndIndex--;
            continue;
        }
        if(nums1[nums1FromEndIndex]<nums2[nums2FromEndIndex])
        {
            nums1[tempFromEndIndex] = nums2[nums2FromEndIndex];
            nums2FromEndIndex--;
        }
        else
        {
            nums1[tempFromEndIndex] = nums1[nums1FromEndIndex];
            nums1FromEndIndex--;
        }
    }
}

 

 

思路:

如果从下标为0开始,由于nums1和nums2均有值,在找到最小值赋值时,可能会导致数组nums1往后移。所以从nums1的m+n-1的数组最后开始。

如果nums2合并到nums1完毕则不用再处理,因为nums1本就是有序数组。如果nums1合并完毕,则nums2直接移动即可,因为nums2也是有序的数组。

标签:int,合并,算法,数组,tempFromEndIndex,递减,nums1,nums2
From: https://www.cnblogs.com/Sna1lGo/p/17837515.html

相关文章

  • 区间树上查找所有与给定区间相交的区间-算法复杂度正确性证明
    区间树是在平衡树上维护的数据结构,按照左端点大小排序。详见《算法导论》。算法设计思路红黑树的拓展在红黑树上维护结点属性\(min,max\):\(min\)表示该结点及其所有后代结点中的区间低端的最小值。\(max\)表示该结点及其所有后代结点中的区间高端的最大值。在插入时,对结点......
  • Dijkstra算法
    Dijkstra算法1.算法基本介绍Dijkstra算法是一个基于「贪心」、「广度优先搜索」、「动态规划」求一个图中一个点到其他所有点的最短路径的算法,时间复杂度O(n2)。Dijkstra算法通常是求解单源最短路中最快的算法,但它无法处理存在负权边的情况(原因在正确性证明中)。Dijkstra本质......
  • 最小生成树(Kruskal和Prim算法)
    最小生成树(Kruskal和Prim算法)部分资料来源于:最小生成树(Kruskal算法)_kruskal算法求最小生成树-CSDN博客、【算法】最小生成树——Prim和Kruskal算法-CSDN博客关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若......
  • Java数组03:三种初始化及内存分析
    声明的时候数组并不存在,只有创建的时候数组才存在  publicclassArrayDemo02{publicstaticvoidmain(String[]args){//静态初始化:创建+赋值int[]a={1,2,3,4,5,6,7,8};System.out.println(a[0]);//动态初始......
  • Java数组02:数组的声明和创建
    ublicclassArrayDemo01{publicstaticvoidmain(String[]args){//数组类型int[]nums;//intnums[];声明一个数组nums=newint[10];//这里面可以存放10个int类型的数字;创建一个数组//给数组赋值for(inti=0;i<=9;+......
  • 蓝桥杯第三周算法竞赛D题&&E题
    发现更多计算机知识,欢迎访问Cr不是铬的个人网站D迷宫逃脱拿到题目一眼应该就能看出是可以用动态规划来解决。但是怎么定义dp呢?这个题增加难度的点就在当所在位置与下一个要去的位置互质的时候,会消耗一把钥匙。当没有钥匙的时候就不能移动了。想到这里,我们可以定义一个三维的d......
  • 算法总结
    贪心算法解决问题:最优化问题;优点:是解决最优化问题的最优策略,时间复杂度低;缺点:要满足局部最优解可以推出全局最优解,这意味着在考场上想出一个贪心策略需要通过举例以及证明。常见思考方式:如果是决定谁先做谁后做的,类比排队问题,邻项交换;如果先后有限制关系,比如谁先做......
  • 实验4 C语言数组应用编程
    1实验任务1task1_1源代码1#include<stdio.h>2#defineN43voidtest1(){4inta[N]={1,9,8,4};5inti;6//输出数组a占用的内存字节数7printf("sizeof(a)=%d\n",sizeof(a));8//输出int类型数组a中每个元素的地址、值9for(i=0;i<N;......
  • 算法~totp用作签名防止url被复用
    之前写过关于totp的文章,对它的基础有不清楚的同学,可以先看我的这篇文章《TOTP基础一》《TOTP基础二》想到的问题因为totp是把时间分成了一个一个小的时间窗口,当生成totp的服务器和校验totp的服务器不在一起时间窗口,就会出现验证失败的问题,这是不可避免的,时间戳是一个long类型的......
  • 树算法题
    目录1、计算二叉树中所有结点个数2、计算二叉树中所有叶子节点的个数3、计算二叉树中所有双分支的节点个数4、计算二叉树的深度5、找出二叉树中最大值的点6、判断两个二叉树是否相似(指都为空或者都只有一一个根节点,或者左右子树都相似)7、把二叉树所有节点左右子树交换8......