回溯法2,組合,條件,選擇性
阿新 • • 發佈:2020-10-18
一.題源
https://www.lintcode.com/problem/subsets-ii/description
https://leetcode-cn.com/problems/subsets-ii/
不同於子集I,這次有一點小變化,就是在演算法中加入了條件判斷,即去除重複元素。將不滿足的條件的結果剔除,不算入總結果集。
二.程式碼
public class Solution { public static void main(String[] args) { int[] arr = new int[]{1,2,2}; Arrays.sort(arr); ArrayUtils.displayArrayList(subsetsWithDup(arr)); }public static List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> result = new ArrayList<>(); backTrace(result,new ArrayList<>(),nums,0); return result; } private static void backTrace(List<List<Integer>> result,List<Integer> list,int[] nums,int pos){ result.add(new ArrayList<>(list)); for (int i = pos; i < nums.length; i++) { //剔除重複的數字,除了第一個元素 if(i!=pos&&nums[i]==nums[i-1]){ continue; } list.add(nums[i]); backTrace(result,list,nums,i+1); list.remove(list.size()-1); } } }
三.圖解分析
四. 總結
回溯法問題基本套路都一致
1.定義好總的結果集
2.定義好遞迴的出口和條件,比如長度超過最大值,下標超出原始資料長度等,當然有些情況可能不需要條件,那就讓迴圈結束,自動退出就行。
3.計算區域性結果集,把符合條件的結果加入區域性結果集。
4.逐個從原始資料試探,試探一次,進入下一次遞迴。
5.將上次結果移除,進行一個數據的試探。
6.重複3-4,直到滿足2退出,將區域性結果儲存至總結果集。