Subsets - leescode

Given a set of distinct integers, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,

If S = [1,2,3], a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

分析:用result存结果,tmp存每一个子集,若符合条件,则将tmp加入result。为了不出现重复,定义一个int position来表示当前子集的第一个元素的位置,每次添加元素,然后进入递归,再添加元素知道i之后的都添加完,最内层的递归里的循环结束,开始执行remove,(以[ 1,2,3] 为例)先是remove3,则最内层递归调用执行完毕,再跳到上一层,执行remove2,此时上一层的循环第一步完成,接着继续完成循环,i++,所以此时i = 2,不是i=1,所以就是添加3,即 [1, 3];


举例:[1,2,3]

[1]

[1,2]

[1,2,3]//此处,去掉3最底层递归调用结束,到上一层,再去掉2,此时进入上一层循环的第二个循环,i++后添加的元素是3

[1,3]//见上一行分析

[2]

[2,3]

[3]

[ ]

代码:

public class Solution {
    public ArrayList<ArrayList<Integer>> subsets(int[] S) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        Arrays.sort(S);
        result.add(tmp);
        dfs(result, tmp, S, 0);
        return result;
    }
    
    public void dfs(ArrayList<ArrayList<Integer>> result, ArrayList<Integer> tmp, int[] S, int pos) {
        for (int i = pos; i <= S.length - 1; i++) {
            tmp.add(S[i]);
            result.add(new ArrayList<Integer>(tmp));
            dfs(result, tmp, S, i + 1);
            tmp.remove(tmp.size() - 1);
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
好的,您的问题是如何实现快速排序算法并进行效率分析,同时使用随机生成的整数进行排序并将结果保存到文件中。我可以帮您解决这个问题。 首先介绍一下快速排序算法的基本思想:首先在数组中选择一个元素作为基准值,然后把数组中小于基准值的元素放在它的左边,大于基准值的元素放在它的右边。然后对左右两个子集递归地进行同样的操作,直到子集中只有一个元素或者为空。快速排序的时间复杂度为O(nlogn),是一种比较高效的排序算法。 下面是快速排序算法的实现代码(使用C++语言): ```cpp #include <iostream> #include <fstream> #include <ctime> #include <cstdlib> using namespace std; void quicksort(int arr[], int left, int right) { if (left >= right) return; // 递归终止条件 int i = left, j = right, pivot = arr[left]; while (i < j) { while (i < j && arr[j] >= pivot) j--; if (i < j) arr[i++] = arr[j]; while (i < j && arr[i] < pivot) i++; if (i < j) arr[j--] = arr[i]; } arr[i] = pivot; quicksort(arr, left, i - 1); quicksort(arr, i + 1, right); } int main() { const int N = 100000; // 元素个数 int arr[N]; srand(time(NULL)); // 用系统时间初始化随机数种子 ofstream fout("input.txt"); // 打开输出文件流 for (int i = 0; i < N; i++) { arr[i] = rand(); // 生成随机数 fout << arr[i] << endl; // 写入文件 } fout.close(); // 关闭输出文件流 clock_t start, finish; start = clock(); // 记录开始时间 quicksort(arr, 0, N - 1); // 快速排序 finish = clock(); // 记录结束时间 cout << "Time used: " << (double)(finish - start) / CLOCKS_PER_SEC << "s" << endl; ofstream fout2("output.txt"); // 打开输出文件流 for (int i = 0; i < N; i++) { fout2 << arr[i] << endl; // 写入文件 } fout2.close(); // 关闭输出文件流 return 0; } ``` 在这个代码中,我们首先生成N个随机数并保存到文件“input.txt”中,然后读入这些随机数并进行快速排序操作,最后将排序结果保存到文件“output.txt”中。同时,我们使用clock()函数来记录排序所用的时间,单位为秒。 需要注意的是,当N的值较大时,排序时间可能会比较长,甚至可能超过几分钟。因此,我们可以考虑使用更为高效的排序算法,如归并排序、堆排序等。同时,我们还可以使用多线程等技术来加速排序过程。 希望这个回答能够帮助您解决问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值