zoukankan      html  css  js  c++  java
  • [LeetCode] Merge Sorted Array

    https://leetcode.com/problems/merge-sorted-array/?tab=Description

    要求不用辅助数组实现merge two sorted array,条件是一个数组的空间足够大。解法是先将nums1的所有元素整体向后平移n个单位,然后算法就和merge two sorted array一样了,只不过nums1的初始指针在位置n处。

    class Solution {
    public:
        void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
            for (int i = m - 1; i >= 0; --i) {
                nums1[i+n] = nums1[i];
            }
            
            int p = n, q = 0, k = 0;
            while (p < m + n && q < n) {
                if (nums1[p] < nums2[q])
                    nums1[k++] = nums1[p++];
                else
                    nums1[k++] = nums2[q++];
            }
            while (p < m + n) {
                nums1[k++] = nums1[p++];
            }
            while (q < n) {
                nums1[k++] = nums2[q++];
            }
        }
    };
    

    更好的做法是直接逆着做merge two sorted array, 一个指针从大数组的m-1位置开始,另一个指针从小数组的n-1位置开始,每次取较大的放在大数组的m+n-1位置, m+n-2位置,...

    class Solution {
    public:
        void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
            int p = m - 1, q = n - 1, k = m + n - 1;
            while (p >= 0 && q >= 0) {
                if (nums1[p] > nums2[q]) {
                    nums1[k--] = nums1[p--];
                } else {
                    nums1[k--] = nums2[q--];
                }
            }
            while (p >= 0) {
                nums1[k--] = nums1[p--];
            }
            while (q >= 0) {
                nums1[k--] = nums2[q--];
            }
        }
    };
    
  • 相关阅读:
    第三章-套接字编程
    unix网络编程第四章----基于TCP套接字编程
    unix网络编程第一章demo
    unix网络编程第2章
    论epoll的实现
    Select函数实现
    函数式编程语言
    Git
    python库-urllib
    PIL处理图片信息
  • 原文地址:https://www.cnblogs.com/ilovezyg/p/6410230.html
Copyright © 2011-2022 走看看