Leetcode.1718 构建字典序最大的可行序列
生活随笔
收集整理的這篇文章主要介紹了
Leetcode.1718 构建字典序最大的可行序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:
??
思路:
?? 這道題目乍看之下沒有特別適用的算法,于是嘗試用深度優先的方法直接暴力搜索。根據題干描述,最后生成序列的長度為2n-1。為了滿足第三個條件,在搜索過程中如果在當前位置(假設對應數字為i)填入除1以外的數字(假設為j),則可以在對應i+j位置同時填入j,這樣最后得到的序列是滿足第3個條件的。而為了滿足字典序最大的條件,搜索數字時需要從n向2,從大到小搜索,這樣得到的第一個序列就是題目所求序列。以上為基本思路。
? 在代碼實現時,我踩過的坑主要有2個:
??? 1.代碼中遞歸調用到的地方有兩處,其中第一處是當前位置部位不為空(即當前位置是之前搜索中已經填入的兩個位置中的后面一個),這種情況可以直接搜索下一個位置,但是需要注意在當前遞歸函數搜索完成,進入下一步時需要先驗證一下當前位置是否為空。如果不為空說明該位置仍然是之前已經填入過的位置,這種情況說明前面的嘗試失敗,應該直接返回,不進入之后的搜索過程。如果此處再進行修改則會導致不符合第三個條件。
? 2.在第二個遞歸調用的地方,如果當前選擇的數字不是1,則應該同時復原兩個位置為空。如果只復原一個同樣會造成前后不一的情況
代碼
??
class Solution:def constructDistancedSequence(self, n: int) -> List[int]:if n==1:return [1]vis=[False for i in range(2*n-1)]temp=['' for i in range(2*n-1)]ans=[]flag=Falsedef dfs(cur):nonlocal vis,n,ans,temp,flagif flag:returnif cur==2*n-1:ans=copy.deepcopy(temp)flag=Truereturnif temp[cur]!='':dfs(cur+1)if temp[cur]!='':returnfor i in range(n,0,-1):if not vis[i]:if i==1:temp[cur]=ielse:if cur+i>=2*n-1:continueif temp[cur+i]!='':continuetemp[cur]=itemp[cur+i]=iprint(temp,i)vis[i]=Truedfs(cur+1)vis[i]=Falseif i!=1:temp[cur+i]=''temp[cur]=''vis[i]=0dfs(0)return ans?
總結
以上是生活随笔為你收集整理的Leetcode.1718 构建字典序最大的可行序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51单片机之DS18B20温度传感器实验
- 下一篇: python实现空气质量提醒程序_基于P