力扣46:全排列
- 題目
- 思路
- 代碼
題目
給定一個不含重復數字的數組 nums ,返回其 所有可能的全排列 。你可以 按任意順序 返回答案。
思路
看到所有可能首先想到的就是回溯。
回溯的結束條件也很好寫,用數組的長度來判斷即可。這道題的難點主要是如何進行判斷這個位置我們已經使用過了,和我們之前的回溯不同之前的回溯可能每個位置是一個字符串或者數組所以我們可以使用下標來控制,這道題我們每個位置都只是一個數字所以我們得另想辦法。其實也很簡單我們用一個存儲著bool類型的數組不就可以了如果這個位置已經插入了我們就把對應下標設為true如果沒插入就是flase。思路有了代碼就很簡單了。
代碼
class Solution {
public:void BackCall(vector<vector<int>>& res,vector<int>& nums,vector<bool>& v,vector<int> tmp){if(tmp.size() == nums.size()){res.push_back(tmp);return;}for(int i = 0; i <nums.size();i++){if(v[i] == true){continue;}v[i] = true;tmp.push_back(nums[i]);BackCall(res,nums,v,tmp);tmp.pop_back();v[i] = false;}}vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> res;vector<int> tmp;//使用索引和bool類型來判斷此位置是否已經使用過了vector<bool> v(nums.size(),false);//回溯BackCall(res,nums,v,tmp);return res;}
};