一、题目内容

image.png

二、题解

解法1:

思路

全排列+数组长度排序

代码

  1. public class Solution {
  2. ArrayList<ArrayList<Integer>> ans;
  3. ArrayList<Integer> path;
  4. int[] nums;
  5. public ArrayList<ArrayList<Integer>> subsets(int[] S) {
  6. ans = new ArrayList();
  7. path = new ArrayList();
  8. this.nums = S;
  9. recur(0);
  10. //sortByLen(ans,1,ans.size()-1);
  11. return ans;
  12. }
  13. private void recur(int x){
  14. ans.add(new ArrayList(path));
  15. for(int i = x;i<nums.length;i++){
  16. path.add(nums[i]);
  17. recur(i+1);
  18. path.remove(path.size()-1);
  19. }
  20. }
  21. Collections.sort(new ArrayList<T>(),new Comparable<Integer>(){
  22. @Override
  23. public int compareTo(Integer o) {
  24. return 0;
  25. }
  26. });
  27. private void sortByLen(ArrayList<ArrayList<Integer>> ans,int low,int high){
  28. if(low>=high){
  29. return;
  30. }
  31. int partation = partation(ans,low,high);
  32. sortByLen(ans,low,partation-1);
  33. sortByLen(ans,partation+1,high);
  34. }
  35. private int partation(ArrayList<ArrayList<Integer>> ans,int low,int high){
  36. int left = low,right = high;
  37. int target = ans.get(left).size();
  38. ArrayList<Integer> temp = ans.get(left);
  39. while(left<right){
  40. while(left<right&&ans.get(right).size()>target){
  41. right--;
  42. }
  43. ans.set(left,ans.get(right));
  44. while(left<right&&ans.get(left).size()<target){
  45. left++;
  46. }
  47. ans.set(right,ans.get(left));
  48. }
  49. ans.set(left,temp);
  50. return left;
  51. }
  52. }