2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Mitä on perääntyminen?
Kun etsit tiettyä solmua, jos havaitsemme, että nykyinen solmu (ja sen alisolmut) ei ole vaadittu kohde, palaamme alkuperäiseen solmuun jatkamaan hakua ja palauttamaan nykyisen solmun muokatun tilan.Muista kaksi pientä vinkkiä:Ensimmäinen on välittää tila viitteellä (&), ja toinen on muuttaa kaikkia tilamuutoksia, kun rekursio on valmis.Muokkauksille on yleensä kaksi tapaa, joista toinen on muuttaa tulosteen viimeistä bittiä, kuten permutaatio ja yhdistelmä.Muista esimerkiksi merkkijonon etsiminen matriisista.
aiheAnnettu taulukko ilman päällekkäisiä numeroita
nums
, palauta sekaikki mahdolliset permutaatiot .sinä pystytmissä tahansa järjestyksessäPalauta vastaus.Esimerkki 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]Esimerkki 2:
输入:nums = [0,1] 输出:[[0,1],[1,0]]Esimerkki 3:
输入:nums = [1] 输出:[[1]]vihje:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
kaikki kokonaisluvut sisääneroavat toisistaan
vastausKaikkien taulukon lajiteltujen yhdistelmien tulostamiseksi voimme käyttää backtracking-menetelmää.Määritä ensin sijainti ja vaihda se sitten jokaisen seuraavan sijainnin kanssa. Vaihdon jälkeen siirry seuraavaan paikkaan. Kun tämä vaihesarja on suoritettu, sinun on vaihdettava korvatut. Se on paluumenetelmä.![]()
- class Solution {
- public:
- vector<vector<int>> permute(vector<int>& nums) {
- vector<vector<int>> ans;
- back(nums,0,ans);
- return ans;
- }
- void back(vector<int>& nums,int n,vector<vector<int>>& ans){
- int i;
- if(n==nums.size()-1)
- ans.push_back(nums);
- for(i=n;i<nums.size();i++){
- swap(nums[i],nums[n]);
- back(nums,n+1,ans);
- swap(nums[i],nums[n]);
- }
- }
- };
aihe
Annettu kaksi kokonaislukua
n
jak
, paluualue[1, n]
kaikki mahdollinen sisäänk
numeroiden yhdistelmä.voit painaamikä tahansa tilausPalauta vastaus.
Esimerkki 1:
输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]Esimerkki 2:
输入:n = 1, k = 1 输出:[[1]]vihje:
1 <= n <= 20
1 <= k <= n
题解
Aseta luku ja laske kunkin numero Kun count==k, laita se taulukkoon. Tämä eroaa aiemmista, jotka olivat permutaatioita ja yhdistelmiä. Tämä on vähän kuin taulukon valitseminen.
Alkaen 1-n, määritä ylimääräinen matriisi tallentaaksesi kunkin ajan tulokset. Luku muuttuu dynaamisesti i:n määrittämisen jälkeen, ja luku valitaan dfs:stä (i+1, n). Laske - taaksepäin jäljityksen jälkeen.
class Solution { public: vector<vector<int>> combine(int n, int k) { vector<vector<int>> ans; vector<int> c(k,0); int count; dfs(n,k,1,ans,c,count); return ans; } void dfs(int n,int k,int level,vector<vector<int>>& ans,vector<int>& c,int& count){ int i; if(count==k){ ans.push_back(c); return ; } for(i=level;i<=n;i++){ c[count++]=i; dfs(n,k,i+1,ans,c,count); --count; } } };
aihe
annettu a
m x n
2D merkkiruudukkoboard
ja merkkijono sanaword
.josword
on olemassa ruudukossa, palaatrue
; muussa tapauksessa palautafalse
。Sanat on muodostettava vierekkäisten solujen kirjaimista aakkosjärjestyksessä, jossa "vierekkäiset" ovat ne, jotka ovat vierekkäin vaaka- tai pystysuunnassa. Saman solun kirjaimia ei saa käyttää toistuvasti.
Esimerkki 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED" 输出:trueEsimerkki 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE" 输出:trueEsimerkki 3:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB" 输出:falsevihje:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
jaword
Koostuu vain isoista ja pienistä englanninkielisistä kirjaimista
vastaus
Samanlainen rutiini.
Dfs+backtracking-menetelmä määrittelee ensin käynnin, jolla merkitään, onko sijainti merkitty jokaisen haun aikana, jotta samassa paikassa ei käyty useita kertoja.
Sijainnin osalta on tehtävä rajapäätös sen määrittämiseksi, ylittääkö se rajan. Määritä sitten, onko siinä vieraillut, onko se onnistuneesti löydetty ja onko tässä paikassa oleva kirjain erilainen kuin kohdekirjain.
dfs, etsi ympäriltäsi.
class Solution { public: bool exist(vector<vector<char>>& board, string word) { if(board.empty()) return false; int m=board.size(),n=board[0].size(); vector<vector<bool>> visit(m,vector<bool>(n,false)); int i,j; bool find=false; for(i=0;i<m;i++){ for(j=0;j<n;j++) back(i,j,board,word,find,visit,0); } return find; } void back(int i,int j,vector<vector<char>>& board,string& word, bool& find,vector<vector<bool>>& visit,int level){ if(i<0||i>=board.size()||j<0||j>=board[0].size()) return ; if(visit[i][j]||find||board[i][j]!=word[level]) return ; if(level==word.size()-1){ find=true; return ; } visit[i][j]=true; back(i+1,j,board,word,find,visit,level+1); back(i-1,j,board,word,find,visit,level+1); back(i,j+1,board,word,find,visit,level+1); back(i,j-1,board,word,find,visit,level+1); visit[i][j]=false; } };
aihe
Shakin sääntöjen mukaan kuningatar voi hyökätä nappulaa samalla rivillä tai sarakkeella tai samalla diagonaalilla.
n Queen-ongelmaTutkitaan, miten
n
kuningatar sijoitettun×n
shakkilaudalla, jolloin kuningattaret eivät pysty hyökkäämään toisiaan vastaan.Anna kokonaisluku
n
, palauttaa kaikki erilaisian kuningatar ongelmas ratkaisu.Jokainen ratkaisu sisältää erilaisenn Queen-ongelmaShakkinappuloiden sijoitussuunnitelma tässä suunnitelmassa
'Q'
ja'.'
Ne edustavat kuningatarta ja vastaavasti tyhjää istuinta.Esimerkki 1:
输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。Esimerkki 2:
输入:n = 1 输出:[["Q"]]vihje:
1 <= n <= 9
题意
N Queen vaatii kolme merkintätoimintoa, joista yksi on sarake, toinen on päälävistäjä ja toinen on toissijainen diagonaali.
Koska jokaisella rivillä on varmasti kuningatar, se kulkee rivi riviltä Kun viimeinen rivi on onnistuneesti ajettu ja kuningatar on sijoitettu onnistuneesti. Rivimerkintätoimintoa ei siis tarvitse asettaa.
Tällä hetkellä voimme aloittaa ensimmäiseltä riviltä ja kulkea sarakkeittain. Selvitä, onko sarake epätosi, onko päälävistäjä epätosi ja onko toissijainen diagonaali epätosi. Jos näin on, siirry seuraavaan sarakkeeseen. Jos ei, aseta asemaksi Q ja suorita sama haku seuraavalle riville. Backtracking menetelmä, muista palauttaa sijainti ja merkintätoiminnot haun jälkeen.
Tämä lävistäjä ja subdiagonaali. Se voidaan piirtää koordinaatteihin, joista toinen on y=x+b, toinen on y=-x+b.
Joten b=yx, jotta saadaan b>0, joten lisäämme n. Toinen on y+x.
class Solution { public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>> ans; if(n==0) return {}; vector<string> board(n,string(n,'.')); vector<bool> c(n,false),l(2*n-1,false),r(2*n-1,false); back(n,ans,board,c,l,r,0); return ans; } void back(int n,vector<vector<string>>& ans,vector<string>& board,vector<bool>& c, vector<bool>& l,vector<bool>& r,int row){ if(row==n){ ans.push_back(board); return ; } int i; for(i=0;i<n;i++){ if(c[i]||l[row-i+n]||r[row+i]){ continue; } board[row][i]='Q'; c[i]=l[row-i+n]=r[row+i]=true; back(n,ans,board,c,l,r,row+1); board[row][i]='.'; c[i]=l[row-i+n]=r[row+i]=false; } } };
Tee yhteenveto
Selvitä paluumenetelmää varten ensin reunaehdot ja loppuehdot. Yleensä i-joukko on yhtä suuri kuin rivien lukumäärä.
Rajaehtona on yleensä olla ylittämättä rajaa.
Yleensä merkintätoiminto on asetettava. Siirry sitten rivi riviltä tai sijainti sijainnilta, ja vierailtu tunnistetoiminto asetetaan arvoon tosi. Jatka sitten seuraavalle tai seuraavalle riville (yleensä rekursiivisesti). Palauta sitten yllä oleva merkintätoiminto ja taulu viimeistelyn jälkeen (yleensä yksi asetetaan vastaukseksi). Jos se vastaa, push_back ans-taulukkoon.