四种语言刷算法之 组合总和 II

力扣40. 组合总和 II 
1、C
void back(int* candidates, int candidatesSize, int target,int start,int *path,int *pathSize,int **result,int** returnColumnSizes,int *visited,int* returnSize,int *sum){
    if(*sum == target){
        result[*returnSize] = (int *)malloc(sizeof(int)*(*pathSize));
        memcpy(result[*returnSize],path,sizeof(int)*(*pathSize));
        (*returnColumnSizes)[*returnSize] = *pathSize;
        (*returnSize)++;
        return; 
    }
    for(int i=start;i<candidatesSize; i++){
        if((*sum)+candidates[i]>target){break;}
        if(i>0&&candidates[i-1]==candidates[i]&&visited[i-1]==0){
            continue;
        }
        path[*pathSize] = candidates[i];
        (*pathSize)++;
        (*sum) += candidates[i];
        visited[i] = 1;
        back(candidates,candidatesSize,target,i+1,path,pathSize,result,returnColumnSizes,visited,returnSize,sum);
        visited[i] = 0;
        (*sum) -= candidates[i];
        (*pathSize)--;
    }
}
void QuickSort1(int* a, int left, int right)
{
    if (left >= right)
    {
        return;
    }
    int begin = left, end = right;
    //三数取中
    //int midIndex = GetThreeMid(a,begin,end);
    //Swap(&a[begin],&a[midIndex]);
    int pivot = begin;
    int key = a[begin];
    
    while (begin < end)
    {
        //右边找小的,如果不是小于key,继续
        while (begin < end && a[end] >= key)
        {
            end--;
        }
        //找到比key小的,把它放在坑里,换新坑
        a[pivot] = a[end];
        pivot = end;
        //左边找大的,如果不是大于key,继续
        while (begin < end && a[begin] <= key)
        {
            begin++;
        }
        //找到比key大的,把它放在坑里,换新坑
        a[pivot] = a[begin];
        pivot = begin;
    }
    a[pivot] = key;//bengin 与 end 相遇,相遇的位置一定是一个坑
    QuickSort1(a, left, pivot - 1);
    QuickSort1(a, pivot + 1, right);
}
int** combinationSum2(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes){
    
    *returnSize = 0;
    int *path = (int *)malloc(sizeof(int)*candidatesSize);
    int *pathSize = (int *)calloc(1,sizeof(int));
    int **result = (int **)malloc(sizeof(int *)*100001);
    *returnColumnSizes = (int *)malloc(sizeof(int *)*100001);
    int *visited = (int *)calloc(candidatesSize,sizeof(int));
    int *sum = (int *)calloc(1,sizeof(int));
    QuickSort1(candidates,0,candidatesSize-1);
    back(candidates,candidatesSize,target,0,path,pathSize,result,returnColumnSizes,visited,returnSize,sum);
    return result;
}
2、C++
class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void back(vector<int>& candidates, int target,int start,int sum,vector<bool> &visited){
        if(sum==target){
            result.push_back(path);
            return;
        }
        for(int i=start;i<candidates.size();i++){
            if(sum+candidates[i]>target){break;}
            if(i>0&&candidates[i-1]==candidates[i]&&visited[i-1]==false){continue;}
            path.push_back(candidates[i]);
            sum += candidates[i];
            visited[i] = true;
            back(candidates,target,i+1,sum,visited);
            visited[i] = false;
            sum -= candidates[i];
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        vector<bool> visited(candidates.size(),false);
        back(candidates,target,0,0,visited);
        return result;
    }
};
3、JAVA
class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public void back(int[] candidates, int target,int start,int sum,boolean[] visited){
        if(sum==target){
            result.add(new ArrayList(path));
            return;
        }
        for(int i=start;i<candidates.length;i++){
            if(sum+candidates[i]>target){break;}
            if(i>0&&candidates[i-1]==candidates[i]&&visited[i-1]==false){continue;}
            path.addLast(candidates[i]);
            visited[i] = true;
            sum += candidates[i];
            back(candidates,target,i+1,sum,visited);
            sum -= candidates[i];
            visited[i] = false;
            path.removeLast();
        }
    }
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        boolean[] visited = new boolean[candidates.length];
        Arrays.fill(visited,false);
        back(candidates,target,0,0,visited);
        return result;
    }
}
4、Python
 
class Solution(object):
    def __init__(self):
        self.result = []
        self.path = []
        self.visited = []
    def combinationSum2(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        candidates.sort()
        self.visited = [False]*len(candidates)
        self.back(candidates,target,0,0)
        return self.result

    def back(self,candidates,target,start,sum):
        if sum == target:
            self.result.append(self.path[:]);
            return
        for i in range(start,len(candidates)):
            if sum + candidates[i]>target:
                break
            if i>0 and candidates[i-1]==candidates[i] and self.visited[i-1]==False:
                continue
            self.path.append(candidates[i])
            sum += candidates[i]
            self.visited[i] = True
            self.back(candidates,target,i+1,sum)
            self.visited[i] = False
            sum -= candidates[i]
            self.path.pop()

 

 
posted @ 2022-12-15 12:48  菜鸟冲冲冲  阅读(36)  评论(0)    收藏  举报