面試演算法 排列組合子集一鍋端

2021-10-11 09:13:03 字數 3648 閱讀 7387

方**:

看題五分鐘,不會做,看解析;

先看中文站,再看國際站;

選擇最優解析;

回頭再來寫

面試四步走:

和面試官,**題目限制條件;

說說可能解,選擇最優解;

碼字;跑測試用例

思維要點:

不要人肉進行遞迴

找到最近最簡方法,將其拆解成可重複解決的問題(重複子問題)

數學歸納法思維

題目:給定一組不含重複元素的整數陣列 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 我的思路可看這裡 總結一下 用回...