【LeetCode】两个有序数组合成一个有序数组(NEW)

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:

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

输出: [1,2,2,3,5,6]

解法1:

之前如果不考虑合并,空间上新增一个数组可以解决这个问题

解法2:

合并的解法,题目说把2合并到1,那么1的空间肯定大于2

思路

1. 我们需要不断的把2中的数字插入到1中,直到2中的数字都插入到1中

2. 2中的数字插入到1中需要注意有两种情况,一种是1,2两个数组始终做比较,一种是1的数组中数字都已比较完,这样直接把2中数字插入到1中就可以了class Solution(object)def merge(self, nums1, m, nums2, n):

"""
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: None Do not return anything, modify nums1 in-place instead.
        """     # 如果2为空,直接返回1
        if n==0:
            return nums1        # p代表合并后的数组1的index
        p = m+n-1     # p1代表合并前数组1的index
        p1 = m-1     # p2代表数组2的index     # p,p1,p2也可以理解为指针
        p2 = n-1
             # 只要数组2还没合并完全就一直合并
        while p2>=0:        # 如果数组1的数字都还没有与2的比较完
            if p1>=0:
                if nums2[p2]>nums1[p1]:
                    nums1[p] = nums2[p2]
                    p2 -= 1
                    p-=1
                else:
                    nums1[p] = nums1[p1]
                    p1 -= 1
                    p-=1else:          # p1<0,代表1的数字都已经从后往前比较完了,这时候只要把2中的数字一个个添加到合并后的数组就好了
                nums1[p] = nums2[p2]
                p-=1
                p2-=1
        return nums1

原文地址:https://www.cnblogs.com/dreamyu/p/11403293.html

时间: 2024-10-28 02:01:13

【LeetCode】两个有序数组合成一个有序数组(NEW)的相关文章

线性时间将两个有序链表合成一个有序链表(constant additional space)

description: given two sorted singly list, merge them into one using constant additional space algorithm: we will reference the two linked list as list1 and list2 for convenience, since list1 is sorted,just find the right position for each element in

两个有序链表合成一个有序链表

RT.... 无聊帮朋友撸个 C++ 作业.. = = 1 /* 2 无聊帮朋友撸个作业...... \ = v = / 3 4 两个有序链表合成为一个有序链表. 5 要求: 6 1. 每个链表元素里的值不超过int范围. 7 2. 两个链表要求为升序(从小到大). 8 9 10 2016.1.5 author : 加德满都的猫会爬树 11 12 */ 13 14 #include <iostream> 15 using namespace std; 16 const int MAX = 10

两个有序数组组成一个有序的数组

package com.hzins.suanfa; import java.util.Arrays; /** * * 两个有序数组组成一个有序的数组 * 整个循环层数为1 * 以其中一个数组做循环,注意另外一个的index是否溢出以及另外一个是否没有遍历完成 * * @author Administrator * */ public class Demo2 { /** * * 1,3,5,7 * 2,4,6,8 * @param a * @param b */ public static voi

输入5个学生的名字(英文),使用冒泡排序按从大到小排序。 提示:涉及到字符串数组,一个字符串是一个一维字符数组;一个 字符串数组就是一个二维字符数组。

#include <stdio.h>#include <string.h> /*输入5个学生的名字(英文),使用冒泡排序按从大到小排序.提示:涉及到字符串数组,一个字符串是一个一维字符数组:一个字符串数组就是一个二维字符数组.*/ void main(){ char stuNames[5][100]; char tmp[100]; int i = 0,j = 0; for(i = 0; i < 5; i++) { printf("请输入第%d个学生的名字:"

将两个无序链表合成一个链表

对于链表,可以先将两个链表排序,然后再将其枚举合成一个链表. 或者是先将一个链表接到另一个链表的尾部,然后将总链表排序. 1 #include <bits/stdc++.h> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <malloc.h> 6 using namespace std; 7 struct Node{ 8 int date; 9

面试题:2个有序数组变为一个有序数组

剑指offer  面试题5的相关题目 2019.3 纽迈科技曾问过这个问题. 思路1 :直接将两个数组合并在一起,然后排序,这时候需要考虑是快排还是啥的排序算法,压根没考虑数组的有序性! 思路2:从头开始,分别比较对应数组,小的留下,这里需要一个问题,若2个数组的len不一样,这时候你要将剩下的那个较长的元素直接存储. 这里学习了.append()   .extend()  和 + 的用法,重新整理: 原文地址:https://www.cnblogs.com/ivyharding/p/11212

返回一个整数数组中最大子数组的和(环)

要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 结对开发:张子超 马思勉 刚看到这个题目首先想到的是将随机产生的数组复制一遍放在原数组后面,然后再进行求解,后来在和马思勉的探讨中得到新的解决思路,首先按照求解整数数组方法,

《软件工程》课堂练习:返回一个整数数组中最大子数组的和

求一个整数数组中最大子数数组的和 实验步骤 从第一个元素开始,每两个相邻数字作为一个新数组,依次相加循环,当和赋值给最大即可求得 #include<stdio.h> int main(){ int a[10]; int b[5]; int i,j,t; printf("请输入10个数(相邻两个数字为一个新数组):\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); getchar(); b[0]=a[0]+a

返回一个整数数组中最大子数组的和(1)

题目要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n) 发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选).源代码.结果截图.总结. 设计思想及代码和结果截图: 1.最开始的想法很简单,使用穷举法.我们列出所有的子数组之和,然后取出其中的最大值,代码如下: public static void main(String[] args) { int [] a = {1,-