今天来讲解一道刷题的时候遇到过的算法题。
题目是要求求出给定数组的所有子序列:
譬如给定一个nums数组{1,2,3},它的所有子序列为{1},{2},{1,2},{3},{1,3},{2,3},{1,2,3}
譬如给定一个nums数组{1,1,3},它的所有子序列为{1},{1},{1,1},{3},{1,3},{1,3},{1,1,3}
废话不多说,直接给出以下的方法的java和python两个版本
def getAllSubArray(nums):
result=[]
count=1<<len(nums)
flag=False
for mark in range(count):
temp=[]
flag=True
for i in range(len(nums)):
if((1<<i)&mark)!=0:
flag=False
temp.append(nums[i])
result.append(temp)
return result
private static ArrayList<ArrayList<Integer>> getAllSubArray(int[] nums) {
ArrayList<ArrayList<Integer>> result=new ArrayList<>();
int mark=0;
int count=1<<nums.length;
boolean flag=false;
for (mark=0;mark<count;mark++) {
ArrayList<Integer> temp=new ArrayList<>();
flag=true;
for (int i=0;i<nums.length;i++) {
if (((1<<i)&mark)!=0) {
flag=false;
temp.add(nums[i]);
}
}
result.add(temp);
}
return result;
}
1.长度为n数数组一共有2的n次方 - 1 个序列
2.我们可以这么理解,子序列就是在原序列上取的,那么原序列被取到的话就是1,否则为0.
(例如原序列 1 2 3,子序列是2,那么抽象的结果就是0 1 0;子序列是 1 3 ,抽象这是 1 0 1;这最大的优点就是可以用二进制来表示,以下表格可以帮助你更好的理解这个做法。假设我们用nums={1,2,3}这里例子)
|
(&)计算结果 |
001 |
010 |
100 |
Result |
|
000 |
0 |
0 |
0 |
{} |
|
001 |
1 |
0 |
0 |
{1} |
|
010 |
0 |
1 |
0 |
{2} |
|
011 |
1 |
1 |
0 |
{1,2} |
|
100 |
0 |
0 |
1 |
{3} |
|
101 |
1 |
0 |
1 |
{1,3} |
|
110 |
0 |
1 |
1 |
{2,3} |
|
111 |
1 |
1 |
1 |
{1,2,3} |
从以上的表格可以不难看出,这种遍历的方式可以将每一种子序列的情况都取到。
本文探讨了一道算法题,涉及求解数组的所有子序列问题。例如,对于数组{1,2,3},其子序列为{1},{2},{1,2},{3},{1,3},{2,3},{1,2,3}。文章提供了Java和Python两种语言的解决方案,利用二进制表示法遍历所有可能的子序列。"
137441187,10911700,解决SpringBoot项目部署出现HTTP 500错误,"['Java', 'Web开发', '网络安全', '服务器运维', 'Spring框架']

403

被折叠的 条评论
为什么被折叠?



