這篇文章將為大家詳細(xì)講解有關(guān)leetcode如何解決全排列問題,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)翁牛特免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
回溯法(探索與回溯法)是一種選優(yōu)搜索法,又稱為試探法,按選優(yōu)條件向前搜索,以達(dá)到目標(biāo)。但當(dāng)探索到某一步時(shí),發(fā)現(xiàn)原先選擇并不優(yōu)或達(dá)不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法,而滿足回溯條件的某個(gè)狀態(tài)的點(diǎn)稱為“回溯點(diǎn)”。
全排列問題,子集問題,組合和問題都是經(jīng)典的回溯問題。
給定一個(gè)沒有重復(fù)數(shù)字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3]
輸出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解題思路:
1,可以遞歸解
2,對于長度為n的全排列,對于任意一個(gè)元素,與長度為n-l的全排列拼接而成
3,注意golang slice append的坑
代碼:
func permute(nums []int) [][]int {
var a [][]int
if len(nums)==0{
return a
}
if len(nums)==1{
return append(a,nums)
}
for i:=0;i<len(nums);i++{
aa:=permute(rest(nums,i))
for j:=0;j<len(aa);j++{
a=append(a,append([]int{nums[i]},aa[j]...))
}
}
return a
}
func rest(nums []int,i int)[]int{
if i==0{
return nums[1:]
}
if i==len(nums)-1{
return nums[:len(nums)-1]
}
return append(nums[0:i:i],nums[i+1:]...)
}
給定一個(gè)可包含重復(fù)數(shù)字的序列,返回所有不重復(fù)的全排列。
示例:
輸入: [1,1,2]
輸出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
解題思路類似,只是求并集的時(shí)候,對比如果有就不并入
func permuteUnique(nums []int) [][]int {
var a [][]int
if len(nums) == 0 {
return a
}
if len(nums) == 1 {
return merge(a, nums)
}
for i := 0; i < len(nums); i++ {
aa := permuteUnique(rest(nums, i))
for j := 0; j < len(aa); j++ {
b := append([]int{nums[i]}, aa[j]...)
a = merge(a, b)
}
}
return a
}
func merge(a [][]int, b []int) [][]int {
l := len(a)
if l == 0 {
a = append(a, b)
} else {
m := false
for k := 0; k < l; k++ {
if match(b, a[k]) {
m = true
}
}
if !m {
a = append(a, b)
}
}
return a
}
func match(a, b []int) bool {
if len(a) == 0 {
return false
}
for i := 0; i < len(a); i++ {
if a[i] != b[i] {
return false
}
}
return true
}
func rest(nums []int, i int) []int {
if i == 0 {
return nums[1:]
}
if i == len(nums)-1 {
return nums[:len(nums)-1]
}
return append(nums[0:i:i], nums[i+1:]...)
}
關(guān)于“l(fā)eetcode如何解決全排列問題”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。
網(wǎng)頁名稱:leetcode如何解決全排列問題
本文來源:http://muchs.cn/article10/igeido.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、小程序開發(fā)、做網(wǎng)站、微信公眾號(hào)、ChatGPT、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)