78. 하위 집합 - 이진 배열 방법의 영리한 사용

78. 하위 집합 - 이진 배열 방법의 영리한 사용

정수 배열 nums가 주어졌는데 배열의 요소는 서로 다릅니다. 이 배열의 가능한 모든 하위 집합(거듭제곱 집합)을 반환합니다.

솔루션 세트에는 중복된 하위 세트가 포함될 수 없습니다. 솔루션 세트를 어떤 순서로든 반환할 수 있습니다.

예시 1:

입력: nums = [1,2,3]
출력: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1, 2,3]]

예시 2:

입력: nums = [0]
출력: [[],[0]]

블로거는 이 질문이 집합의 하위 집합을 만드는 방법을 가르쳐주기 때문에 배울 가치가 있다고 생각합니다. 여기서 좋은 방법은 각 숫자의 이진 01 배열이 다르다는 것입니다. 이런 식으로 우리는 모든 정렬을 열거합니다. 예를 들어 집합의 크기가 3이고 부분 집합의 개수가 8이라면 0부터 7까지의 7개 숫자에 대해 8가지 종류의 01 이진수가 있게 되고, 그러면 1에 해당하게 됩니다. 위치의 데이터는 문제를 매우 잘 해결할 수 있습니다.
솔루션 코드는 다음과 같습니다.

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */


int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    
    
    int len=1;
    
    for(int i=0;i<numsSize;i++){
    
    
        len=len*2;
    }
    int **re=(int **)malloc(sizeof(int*)*len);
    (* returnColumnSizes)=(int *)malloc(sizeof(int)*len);
    * returnSize=len;
    for(int i=0;i<len;i++){
    
    
        (* returnColumnSizes)[i]=0;
        re[i]=(int*)malloc(sizeof(int)*numsSize);
    }
    int psize=0;
    for(int i=0;i<len;i++){
    
    
        int size=0;
        int num=i;
        
        for(int j=0;num>0;j++){
    
    
            if(num&1){
    
    
               printf(" %d %d %d|",psize,size,j);
                re[psize][size++]=nums[j];
               
            }
         
            num=num>>1;

        }
        (* returnColumnSizes)[psize]=size;
        psize++;
    }
    return re;

}

이것은 훌륭한 주제이므로 모든 사람이 이 주제를 공부할 것을 적극 권장합니다.

Guess you like

Origin blog.csdn.net/weixin_43327597/article/details/133161845