• 面试经典150题——Day1


    一、题目

    88.Merge Sorted Array

    You are given two integer arrays nums1 and nums2, sorted in non-decreasing order, and two integers m and n, representing the number of elements in nums1 and nums2 respectively.

    Merge nums1 and nums2 into a single array sorted in non-decreasing order.

    The final sorted array should not be returned by the function, but instead be stored inside the array nums1. To accommodate this, nums1 has a length of m + n, where the first m elements denote the elements that should be merged, and the last n elements are set to 0 and should be ignored. nums2 has a length of n.

    Example 1:

    Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
    Output: [1,2,2,3,5,6]
    Explanation: The arrays we are merging are [1,2,3] and [2,5,6].
    The result of the merge is [1,2,2,3,5,6] with the underlined elements coming from nums1.
    Example 2:

    Input: nums1 = [1], m = 1, nums2 = [], n = 0
    Output: [1]
    Explanation: The arrays we are merging are [1] and [].
    The result of the merge is [1].
    Example 3:

    Input: nums1 = [0], m = 0, nums2 = [1], n = 1
    Output: [1]
    Explanation: The arrays we are merging are [] and [1].
    The result of the merge is [1].
    Note that because m = 0, there are no elements in nums1. The 0 is only there to ensure the merge result can fit in nums1.

    Constraints:

    nums1.length == m + n
    nums2.length == n
    0 <= m, n <= 200
    1 <= m + n <= 200
    -109 <= nums1[i], nums2[j] <= 109

    Follow up: Can you come up with an algorithm that runs in O(m + n) time?

    来源:leetcode

    二、我的笨方法

    class Solution {
    public:
        int min(int a,int b){
            if(a < b) return a;
            else return b;
        }
        void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
            if(n == 0) return;
            vector<int> res;
            int i = 0,j = 0;
            for(int k = 0;k < (m + n);k++){
                if(i < m && j < n){
                    res.push_back(min(nums1[i],nums2[j]));
                    if(res[k] == nums1[i]) i++;
                    else j++;
                }
                else if(i == m && j < n){
                    res.push_back(nums2[j]);
                    j++;
                }
                else if(i < m && j == n){
                    res.push_back(nums1[i]);
                    i++;
                }
            }
            for(int i = 0;i < (m + n);i++){
                nums1[i] = res[i];
            }
            return;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    三、更好的方法

    直接利用sort函数

    class Solution {
    public:
        void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
            for(int i = m,j = 0;i < m + n;i++,j++){
                nums1[i] = nums2[j];
            }
            sort(nums1.begin(),nums1.end());
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    zlMediaKit 10 http相关
    【LeetCode】78. 子集
    循环神经网络
    hdu 4841 “圆桌问题“
    222. 完全二叉树的节点个数
    Puppeteer 启动 chromium问题
    Nginx -- -- 配置SSL证书
    【Flink& Flick CDC】学习笔记
    rabbitMQ:消费者确认模式
    如何实现一个状态机?
  • 原文地址:https://blog.csdn.net/weixin_46841376/article/details/133607301