1. 程式人生 > 實用技巧 >回溯法2,組合,條件,選擇性

回溯法2,組合,條件,選擇性

一.題源

  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退出,將區域性結果儲存至總結果集。