Domanda

Per favore dimmi perché l'espressione i>0 && nums[i] == nums[i-1] && !used[i-1] funziona per ottenere permutazioni uniche.E qual è la matematica dietro di esso?
Il problema è il seguente:
Data una raccolta di numeri che potrebbero contenere duplicati, restituire tutte le possibili permutazioni uniche. Esempio:

Input: [1,1,2]
Output:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]
.

Ecco il codice:

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {   
        vector<vector<int>> result; 
        vector<int> temp;
        vector<bool> used(nums.size(), false);
        sort(nums.begin(), nums.end());
        backtrack(nums, temp, result, used);
        return result;        
    }
    
    void backtrack(vector<int>& nums, vector<int>& temp, vector<vector<int>>& result, vector<bool>& used){
        
        if(temp.size() == nums.size()){
            result.emplace_back(temp);
        }else{
            
            for(int i=0; i<nums.size(); i++){
                if(used[i] || i>0 && nums[i] == nums[i-1] && !used[i-1]) continue; 
                used[i] = true;
                temp.push_back(nums[i]);
                backtrack(nums, temp, result, used);
                used[i] = false;
                temp.pop_back();
            }            
        }        
    }    
};
.

È stato utile?

Soluzione

(1) Stai ordinando il vettore in modo che i valori duplicati saranno presentati consecutivamente nel vettore.

(2) Ora arriviamo alla logica dietro quella condizione:

    .
  • Come il vettore può contenere i duplicati che dovremmo assicurarsi di non ripetere la stessa sequenza iniziando con lo stesso elemento (duplicato)
      .
    • Esempio:
        .
      • 1,1,2 (a partire da first One) e 1,1,2 (a partire da second One)=> entrambi sono gli stessi (dovremmo assicurarci che ciò non accada)

Esempio: in [1, 1, 2]

    .
  • Se il primo elemento nella sequenza è scelto come 1, quindi dovremmo assicurarci che non creeremo un'altra sequenza a partire da un altro 1 (duplicato dell'elemento).

  • Quindi per questo, dobbiamo saltare il ciclo per tutti gli elementi duplicati consecutivi.

  • Nel tuo caso, dopo aver creato una sequenza che fissa il primo 1, quando entriamo nel loop per la seconda volta che controlliamo se l'elemento corrente è un nums[i] == nums[i - 1] duplicato (questo è sufficiente come hai già ordinato il vettore) E se l'elemento corrente è il primo elemento della sequenza !used[i - 1].

      .
    • Nel tuo caso, a causa di questa condizione, il secondo non può essere il primo elemento della sequenza.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top