笔试题: 获取一个数组的所有子串 数组里面元素不重复

版权声明:https://me.csdn.net/qq_42079455 https://blog.csdn.net/qq_42079455/article/details/89086152

1、问题:
获取一个数组的所有子串
数组里面元素不重复
比如
Input: nums = [1,2,3]
Output: [ [3], [1], [2],[1,2,3], [1,3],[2,3],[1,2],[]]
2、解题思路
2.1递归的解法,相当于一种深度优先搜索,由于原集合每一个数字只有两种状态,要么存在,要么不存在,那么在构造子集时就有选择和不选择两种情况,所以可以构造一棵二叉树,左子树表示选择该层处理的节点,右子树表示不选择,最终的叶节点就是所有子集合,树的结构如下:
在这里插入图片描述
参考代码:

import java.util.ArrayList;
import java.util.List;
 
class Solution {
static List<List<Integer>> subsets = new ArrayList<>();
public static void main(String[] args) {
int[] data = { 1, 2, 3 };
System.out.println(subsets(data));
}
 
public static List<List<Integer>> subsets(int[] nums) {
subsetsDFS(nums, 0, new ArrayList<>());
return subsets;
}
 
private static void subsetsDFS(int[] nums, int start, List<Integer> subset) {
         //结束条件
if (start == nums.length) {
subsets.add(new ArrayList<>(subset));
return;
}
         //选择当前元素
subset.add(nums[start]);
subsetsDFS(nums, start + 1, subset);
// 不选择当前元素
subset.remove(subset.size() - 1);
subsetsDFS(nums, start + 1, subset);
}
}

2.2暴力破解法

参考代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Wd_12 {
	public static void main(String[] args) {
		int[] nums = { 1, 2, 3 };
		List<ArrayList<Integer>> arrays = getSubArray(nums);
		for (int i = 0; i < arrays.size(); i++) {
			ArrayList<Integer> sub = arrays.get(i);
			for (int j = 0; j < sub.size(); j++) {
				System.out.print(sub.get(j) + "  ");
			}
			System.out.println();
		}
	}

	public static List getSubArray(int[] nums) {
		int count = (int) Math.pow(2, nums.length);
		List<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
		for (int i = 1; i < count; i++) {
			List<Integer> subarray = new ArrayList<Integer>();
			int temp = i;
			int index = 0;
			while (temp != 0) {
				if ((temp & 1) == 1) {
					subarray.add(nums[index]);
				}
				index++;
				temp = temp >> 1;
			}
			arrays.add((ArrayList<Integer>) subarray);
		}
		return arrays;
	}

}

猜你喜欢

转载自blog.csdn.net/qq_42079455/article/details/89086152