方**:題目:給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。看題五分鐘,不會做,看解析;
先看中文站,再看國際站;
選擇最優解析;
回頭再來寫
面試四步走:
和面試官,**題目限制條件;
說說可能解,選擇最優解;
碼字;跑測試用例
思維要點:
不要人肉進行遞迴
找到最近最簡方法,將其拆解成可重複解決的問題(重複子問題)
數學歸納法思維
class solution
}public:
vector> subsets(vector& nums)
};
題目:給定乙個可能包含重複元素的整數陣列nums,返回該陣列所有可能的子集(冪集)。
# 方法一
class solution
}public:
vector> subsetswithdup(vector& nums)
};
# 方法二
class solution }}
public:
vector> subsetswithdup(vector& nums)
};
個人傾向於方法2,至於原因,請看permutations ii部分;
題目:給定乙個沒有重複數字的序列,返回其所有可能的全排列。
思路:以下兩種方法主要區別是:判斷nums[i]是否在path陣列中,
方法1:是通過標記陣列used
區別;
方法2:是利用algorithms
中的find函式;
# 方法1
class solution
void helper(vector>& res, vector& nums, vector&path, vectorused)
for (int i = 0; i < nums.size(); i++ )}};
# 方法2
class solution
void helper(vector>& res, vector& nums, vector&path)
for (int i = 0; i < nums.size(); i++ )}};
題目:給定乙個可包含重複數字的序列nums
,按任意順序返回所有不重複的全排列。
思路:方法1:當i的值已經在path中或者 i > 0 && nums[i-1] == nums[i] && i-1沒有在path中, 忽略該值,這一行**比較難理解,個人更加傾向於第二種;
# 方法1
class solution
private:
void helper(vector& nums, vector>& res, vector& path, vectorused)
for (int i =0; i < nums.size(); i++)}};
# 方法2
class solution
private:
void helper(vector& nums, vector>& res, vector& path, vectorused)
for (int i =0; i < nums.size(); i++)}}
};
以nums=[1, 1, 2]
說下我的理解:
跟著藍色線條的腳步走,還是那句話,不要陷入人肉遞迴,我們看第乙個nums[0] == nums[1]
,如果藍色線條,繼續往綠色快走的話,就會出現重複選項,因此需要跳過該塊,while(i < nums.size() - 1 && nums[i] = nums[i+1])
就是幹這個事的;同理,會跳過第二個黃色塊;
題目:給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。
class solution
void helper(vector& candidates, vector>& res, vector& path, int target, int start)
for (int i = start; i < candidates.size(); i++)}};
題目: 給定乙個陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。
candidates 中的每個數字在每個組合中只能使用一次。
# 方法1
class solution
// 時間複雜度o(2^n) 空間複雜度kn
void helper(vector& candidates, vector>& res, vector& path, int target, int start)
for (int i = start; i < candidates.size(); ++i)}};
# 方法2
class solution
// 時間複雜度o(2^n) 空間複雜度kn
void helper(vector& candidates, vector>& res, vector& path, int target, int start)
for (int i = start; i < candidates.size(); ++i)}}
};
題目:給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。
返回 s 所有可能的分割方案。
class solution
private:
void helper(string str, vector>& res, vector& path, int start)
//string substr (size_t pos = 0, size_t len = npos) const;
for (int i = start; i < str.size(); i++) }}
bool ispalindrome(string str, int start, int end)
}return true;}};
coding interview tutorial 31: permutations ii[leetcode]
leetcode中文站
leetcode國際站 (將力扣中文鏈結,後面的-cn去掉,就是該題的國際站)
排列 組合 子集
目錄 result def backtrack 路徑,選擇列表 if 滿足結束條件 result.add 路徑 return for 選擇 in 選擇列表 做選擇backtrack 路徑,選擇列表 撤銷選擇 排列問題,講究順序 即 2,2,3 與 2,3,2 視為不同列表時 需要記錄哪些數字已經使用...
排列 組合 子集合
1.陣列中元素的全排列 lintcode 思路 1.對陣列進行排序 2.列舉每乙個位置上選擇什麼數字 3.跳過重複的元素 class solution for int i 0 i n i vector int permuteunique vector s 2.陣列中元素的組合 思路 列舉每個數字選擇...
演算法 回溯求排列組合,子集問題的總結
leetcode上有許多用回溯求排列組合,子集的題目 leetcode46 leetcode47 我的思路可看這裡 leetcode77 我的思路可看這裡 leetcode39 leetcode40 leetcode216 leetcode78 leetcode90 我的思路可看這裡 總結一下 用回...