アルゴリズム:配列の部分配列をバックトラック11のサブセットは、ソリューションの4種類を設定します

タイトル

住所:https://leetcode.com/problems/subsets/

個別の整数の集合を考えると、NUMSは、すべての可能なサブセット(パワーセット)を返します。

注:ソリューション・セットは、重複サブセットを含めることはできません。

例:

Input: nums = [1,2,3]
Output:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

1. DFSバックトラッキング深さ優先溶液

分析的思考:

  1. 配列の要素を横断し、または選択するか、選択していません。
  2. あなたが条件を終了することに注意してくださいif (nums == null || index == nums.length)潜在的な配列が空であることを示し、指標線を交差した後、結果のリストに追加してもよいです。
package backtracking;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

// https://leetcode.com/problems/subsets/
public class Subsets {

  public static void main(String[] args) {
    int[] nums = new int[]{1,2,3};
    Subsets obj = new Subsets();
    List<List<Integer>> resultList = obj.subsets(nums);
    System.out.println(Arrays.toString(resultList.toArray()));
  }

  public List<List<Integer>> subsets(int[] nums) {
    List<List<Integer>> resultList = new ArrayList<List<Integer>>();
    // dfs
    dfs(nums, resultList, new ArrayList<Integer>(), 0);

    return resultList;
  }

  private void dfs(int[] nums, List<List<Integer>> resultList, List<Integer> list, int index) {
    // exit
    if (nums == null || index == nums.length) {
      resultList.add(new ArrayList<Integer>(list));
      return;
    }

    // add item
    list.add(nums[index]);
    dfs(nums, resultList, list, index + 1);

    // not add item
    list.remove(list.size() - 1);
    dfs(nums, resultList, list, index + 1);
  }
}

2.トラバーサルの実行

空のリストからList<List<Integer>> outputList開始する、空のリストを追加しますnew ArrayList<Integer>()(例:すべてのデータを通じて、{1, 2, 3})、

  1. 新しい空のリストを作成しList<List<Integer>> newList
  2. リストをList<List<Integer>> outputList、すべての子どもたちが、新たな数値に追加されました、
比如遍历到1[ ] > [1]
比如遍历到2[ ] > [2]
[1] > [1, 2]
  1. リストをnew ArrayList<Integer>()、サブリストの新しい世代は、既存のリストに追加しましたList<List<Integer>> outputList
    ここに画像を挿入説明
public List<List<Integer>> subsetsWithRecursion(int[] nums) {
  List<List<Integer>> outputList = new ArrayList<List<Integer>>();
  outputList.add(new ArrayList<Integer>());
  for (int num: nums) {
    List<List<Integer>> newList = new ArrayList<List<Integer>>();
    for (List<Integer> list: outputList) {
      newList.add(new ArrayList<Integer>(list) {{ add(num); }});
    }

    for (List<Integer> list: newList) {
      outputList.add(list);
    }
  }

  return outputList;
}

3.ソリューションのバックは、指定した長さを返します。

ここに画像を挿入説明

public List<List<Integer>> subsetsWithBacktrack(int[] nums) {
  List<List<Integer>> resultList = new ArrayList<List<Integer>>();
  for (int len = 0; len <= nums.length; len++) {
    // backtrack
    backtrack(nums, resultList, new ArrayList<Integer>(), 0, len);
  }

  return resultList;
}

private void backtrack(int[] nums, List<List<Integer>> resultList, List<Integer> list, int first, int len) {
  // exit
  if (list.size() == len) {
    resultList.add(new ArrayList<Integer>(list));
    return;
  }

  if (first == nums.length) {
    return;
  }
  list.add(nums[first]);
  backtrack(nums, resultList, list, first + 1, len);
  list.remove(list.size() - 1);
  backtrack(nums, resultList, list, first + 1, len);
}

4ビットアセンブリ

アルゴリズム考えドナルドE.クヌースは。に追加した場合、同じバイナリと長さの配列に組み立て、または追加しません。
ここに画像を挿入説明

public List<List<Integer>> subsetsWithBinarySorted(int[] nums) {
    List<List<Integer>> resultList = new ArrayList<List<Integer>>();
    int n = nums.length;

    for (int i = (int)Math.pow(2, n); i < (int)Math.pow(2, n + 1); i++) {
      // generate bitmask, from 0..00 to 1..11
      String bitmask = Integer.toBinaryString(i).substring(1);

      // append subset corresponding to that bitmask
      List<Integer> list = new ArrayList<Integer>();
      for (int k = 0; k < n; k++) {
        if (bitmask.charAt(k) == '1') {
          list.add(nums[k]);
        }
      }

      resultList.add(list);
    }

    return resultList;
  }

ダウンロード

https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/backtracking/Subsets.java

参照

https://leetcode.com/problems/subsets/solution/

https://www-cs-faculty.stanford.edu/~knuth/taocp.html

公開された127元の記事 ウォン称賛12 ビュー20000 +

おすすめ

転載: blog.csdn.net/zgpeace/article/details/103855352