給定乙個可能包含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。
說明:解集不能包含重複的子集。
示例:輸入: [1,2,2]
輸出:[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
]思路:本題和之前題的區別在於,原集合中的元素是重複的,結果要求和之前的題相同(不能夠含有重複的子集),在上一題上改機即可。首先給原陣列的函式排序,然後用回溯法得到每一種子集,再用set對子集的結果進行去重,最後得到想要答案。
class
solution
private
:void
generate
(int i,vector<
int>
& nums,vector<
int>
& item, vectorint>>
& result, setint>>
& res_set)
item.
push_back
(nums[i]);
if(res_set.
find
(item)
== res_set.
end())
generate
(i+1
,nums,item,result,res_set)
; item.
pop_back()
;generate
(i+1
,nums,item,result,res_set);}
};
candidates 中的每個數字在每個組合中只能使用一次。
說明:
所有數字(包括目標數)都是正整數。
解集不能包含重複的組合。
示例 1:
輸入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集為:
[[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]示例 2:
輸入: candidates = [2,5,2,1,2], target = 5,
所求解集為:
[[1,2,2],
[5]]
思路: 回溯法解決問題,通過剪支來降低問題的複雜度。
class
solution
private
:void
generate
(int i,vector<
int>
& nums,vector<
int>
& item,vectorint>>
& result,
setint>>
& res_set,
int sum,
int target)
sum +
= nums[i]
; item.
push_back
(nums[i]);
if(target == sum && res_set.
find
(item)
== res_set.
end())
generate
(i+1
,nums,item,result,res_set,sum,target)
; sum -
= nums[i]
; item.
pop_back()
;generate
(i+1
,nums,item,result,res_set,sum,target);}
};
每天一刷20200602
問題 寫出乙個程式,接受乙個正浮點數值,輸出該數值的近似整數值。如果小數點後數值大於等於5,向上取整 小於5,則向下取整。思路 其實就是實現乙個正浮點數的四捨五入,可以呼叫math.h中的round 函式直接完成,有點討巧。include include using namespace std in...
每天一刷20200603
問題 編寫乙個函式,計算字串中含有的不同字元的個數。字元在acsii碼範圍內 0 127 換行表示結束符,不算在字元裡。不在範圍內的不作統計。注意是不同的字元 思路 跟之前做過的乙個題相似,那個題是字串去重,稍作修改就行了。include include using namespace std in...
每天一刷20200605
昨天返校,沒有做題。問題 功能 等差數列 2,5,8,11,14 輸入 正整數n 0 輸出 求等差數列前n項和 返回 轉換成功返回 0 非法輸入與異常返回 1 思路 這個題其實就是簡單的等差數列求和,設定好初始項,然後控制好迴圈次數即可。ps 在處理輸入的時候要注意用while 來讀取輸入,不然提交...