leetCode 之 321.拼接最大数 js

题目如图

在这里插入图片描述

思路

  1. 假设一个数组 m,我们为了求解其按照内部元素顺序所能组成的所有的 n 位数的最大数,实现一个函数 getMax
  2. 针对数组 m、n分别求取其最大值,想要使得最大值的位数之和为 k,则需要实现一个mergeArray 的方法,用来 merge 两个最大值数组

代码

    const m = [3, 4, 6, 5], n = [9, 1, 2, 5, 8, 3], k = 5

    const getLargerNum = (m, n, k) => {
        const ml = m.length
        const nl = n.length

        if (k === 0 || ml === nl === 0) return []

        if (k === (ml + nl)) return m >= n ? m.concat(n) : n.concat(m)

        function getMax(arr, n) { // 返回最大的 n 位数,顺序需要与原数组中元素顺序一致
            if (!n) return []
            if (n >= arr.length) return arr

            let array = [], max_index = 0
            while (n > 0) {
                let temp = arr[max_index]
                for (let x = max_index + 1; x <= arr.length - n; x++) {
                    if (temp < arr[x]) {
                        temp = arr[x]
                        max_index = x
                    }
                }
                array.push(temp)
                n--
                max_index++
            }
            return array
        }

        function mergeArray(a, b) { // 将两个最大位数组合在一起
            let i = j = 0, array = [], al = a.length, bl = b.length
            while (i < al || j < bl) {
                if ((b[j] > a[i] && b[j]) || !a[i]) {
                    array.push(b[j])
                    j++
                } else if ((b[j] <= a[i] && a[i]) || !b[j]) {
                    array.push(a[i])
                    i++
                }
            }
            return array
        }

        let index = 0
        let array = []

        while (index <= k) {
            if (index <= ml && k - index <= nl) {
                let temp1 = getMax(m, index)
                let temp2 = getMax(n, k - index)
                let temp = mergeArray(temp1, temp2)
                array = array > temp ? array : temp
            }
            index++
        }
        return array

    }

    console.log(getLargerNum(m, n, k))
posted @ 2020-12-02 17:34  一亩地  阅读(35)  评论(0编辑  收藏  举报