美文网首页
46. Permutations

46. Permutations

作者: xxxcoder | 来源:发表于2020-05-18 23:17 被阅读0次

    算法 1:

    递归
    数组 a = \{a_1, a_2, …, a_n\} 的全排列,等价于\{a_2, a_3, …, a_n\}全排列与a_1可能的取值组合得到。

    算法 2:

    计算一个排列\{a_1, a_2, …, a_n\} 按字典升序排列的紧邻下一个排列
    为了获取一个排列的下一个排列,应对其中一个子序列做调整,使原排列变大为紧邻的下一个排列。假设下一个排列为,a_1', a_2', …, a_{m-1}', a_m', a_{m+1}', …, a_n'。可知,a_1 = a_1', a_2 = a_2', …, a_{m-1} = a_{m-1}' 即只应对子序列 a_m, a_m+1,…, a_n 做调整,使其变为紧邻的下一个排列。
    为使下一个排列与当前排列变化最小,则子序列 a_m, a_{m+1},…, a_ n 应满足如下条件:a_m, a_{m+1}, .., a_n 是所有以a_m开头,元素为 \{a_m, a_{m+1}, .., a_n\} 组成的排列中,最大的一个。则有如下约束:a_m < a_{m+1} > a_{m+2} > … > a_n。 通过如下方式获得子序列紧邻的下一个排列:从a_n, a_{n-1}, …, a_{m+1} 中寻找第一个大于a_m 的数字a_j, 交换a_m, a_j,得到a_j, a_{m+1}, …, a_m, .., a_n。 新得到的序列应为以a_j开头的最大序列。可知交换后的子序列a_{m+1}, …, a_m, …, a_n 仍为降序,则需要对a_{m+1}, …, a_m, …, a_n 进行翻转操作,使其变为降序序列。

    相关文章

      网友评论

          本文标题:46. Permutations

          本文链接:https://www.haomeiwen.com/subject/zipmohtx.html