【问题标题】:Sorting Array of Reversible Arrays可逆数组的排序数组
【发布时间】:2020-11-27 21:58:08
【问题描述】:

我在一个定时 leetcode 类型的问题生成器中遇到了一个问题,很沮丧,除了一些初始输入之外,我无法解决 100% 的测试用例。

该问题要求用户使用数组输入,以便对数组进行排序,使类似的值彼此“接触”。此外,内部数组可以反转,以便可以产生匹配。每个内部数组都可以排序的结果是可能的。

例如,可以对数组 'test = [[3,5],[4,2][5,2]]' 进行排序,以便 test[0] 位于 test[2] 旁边,然后可以匹配测试[1]。最终结果为 test = [[3,5],[5,2][2,4]]。

虽然一个简单的迭代解决方案检查匹配,反转数组并再次检查,移动到下一个数组,然后重复直到所有数组都已排序等,但适用于初始测试用例,但我用完了是时候找到一个更动态的解决方案来处理更复杂的测试用例了,包括当起始内部数组不是最优的时,以及它们是否有多个可能的初始匹配,但只有一个可以保证整个数组可以排序。

以下是原始代码提交后的测试用例失败的示例:

// base test case
test1 = [[3,5],[5,1],[2,7],[1,4],[4,2],[7,0]]

//starting node shift test case
test2 = [[5,1],[2,7],[1,4],[4,2],[7,0],[3,5]]

//multiple node possibilities test case
test3 = [[3,5],[5,1],[2,7],[1,4],[4,2],[9,5]]



function organizer(arr) {
    let temp = arr.shift()
    let result = [temp[0], temp[1]]
    
    while (arr.length) {
        for (let i = 0; i < arr.length; i++) {
            let current = arr[i]
            
            if (current[0] === result[result.length - 1]) {
                result.push(current[1])
                arr = arr.slice(0, i).concat(arr.slice(i + 1))
            } else if (current[1] === result[result.length - 1]) {
                result.push(current[0])
                arr = arr.slice(0, i).concat(arr.slice(i + 1))
            }
        }
    }
    
    return result
}

最初我认为可能需要一些回溯解决方案来检查所有组合,或者使用排列来生成所有可能的数组,然后仅在对所有可能的内部数组进行排序时才返回答案......但我可以'不由认为我错过了一个更明显的解决方案。

我在这里错过了什么?

【问题讨论】:

  • 必须有一些额外的约束,否则问题就是要找到一个哈密顿路径,这是NP-hard的。

标签: javascript arrays algorithm sorting


【解决方案1】:

想象一个图,其中每个数字都是一个顶点,每个数组都是顶点之间的一条边,对应于它的开始和结束数字。

任务是通过该图找到一条欧拉路径:https://en.wikipedia.org/wiki/Eulerian_path。这是一条只遍历每条边一次的路径。

只有当图是连通的并且图中恰好有 0 或 2 个具有奇数度的顶点时,这样的路径才能存在。在这种情况下,可以在线性时间内找到路径。

链接的文章中有更详细的解释,但基本上:

  • 如果有 2 个度数奇数的顶点,则在它们之间找到一条路径。
  • 图的其余部分分解为边缘不相交的循环,然后可以将这些循环相互合并,并在任何公共顶点处与上面的路径合并,以创建一条长路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多