LeetCode 46 47....排列問題
阿新 • • 發佈:2019-02-04
//回溯問題的應用
/** 46:排列問題:給出一個包含不同數字的集合,返回這個集合的所有排列 For example, [1,2,3] have the following permutations: [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1]. 使用遞迴方法返回其所有排列 */ void permuteRecuresive(vector<int>&nums,int begin,vector<vector<int>>&res){ if(begin==nums.size()){ res.push_back(nums); return; } for(int i=begin;i<nums.size();i++){ swap(nums[begin],nums[i]); permuteRecuresive(nums,begin+1,res); //reset swap(nums[begin],nums[i]); } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>>res; permuteRecuresive(nums,0,res); return res; }
/** leetCode 47:現在給出的陣列有重複數字,還是返回他們的所有可能的組合 For example, [1,1,2] have the following unique permutations: [1,1,2], [1,2,1], and [2,1,1]. */ void permuteRecuresive2(vector<int>nums,int begin,vector<vector<int>>&res){ if(begin==nums.size()-1){ res.push_back(nums); return; } for(int i=begin;i<nums.size();i++){ if(i!=begin&&nums[i]==nums[begin])//如果為重複元素,skip continue; swap(nums[begin],nums[i]);//每次都確保子串有序 permuteRecuresive2(nums,begin+1,res); } } vector<vector<int>> permuteUnique2(vector<int>& nums) { vector<vector<int>> res; sort(nums.begin(),nums.end());//排序令重複數字相鄰 permuteRecuresive(nums,0,res); return res; }
/***LeetCode 216. Combination Sum III 輸入一個數字k(1-9),和另一個數n,在{1~9}序列中找到所有 尺寸為k且序列和為n的組合,比如: Input: k = 3, n = 9 Output: [[1,2,6], [1,3,5], [2,3,4]] */ void combinations(vector<vector<int>>&res,vector<int>vs,int k,int n){ if(vs.size()==k&&n==0){ res.push_back(vs); return; } if(vs.size()<k){ for(int i=vs.empty()?1:vs.back()+1;i<=9;i++){ if(n-i<0) break; vs.push_back(i); combinations(res,vs,k,n-i); vs.pop_back(); } } } vector<vector<int>> combinationSum3(int k, int n) { vector<vector<int>>res; vector<int>vs; combinations(res,vs,k,n); return res; }