首页 > 编程语言 >四种语言刷算法之子集 II

四种语言刷算法之子集 II

时间:2023-07-09 11:13:19浏览次数:36  
标签:nums int self II 算法 子集 result path visited

力扣90. 子集 II

1、C

/**
 * 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().
 */
void backtracking(int *nums,int numsSize,int start,int *returnSize,int **returnColumnSizes,int *path,int *pathSize,int *visited,int **result){
    result[*returnSize] = (int*)malloc(sizeof(int)*numsSize);
    memcpy(result[*returnSize],path,sizeof(int)*numsSize);
    (*returnColumnSizes)[*returnSize] = *pathSize;
    (*returnSize)++;
    for(int i=start;i<numsSize;i++){
        if(i>0&&nums[i-1]==nums[i]&&visited[i-1]==0){
            continue;
        }
        path[*pathSize] = nums[i];
        visited[i] = 1; 
        (*pathSize)++;
        backtracking(nums,numsSize,i+1,returnSize,returnColumnSizes,path,pathSize,visited,result);
        (*pathSize)--;
        visited[i] = 0; 
    }
}
void QuickSort1(int* a, int left, int right)
{
    if (left >= right)
    {
        return;
    }
    int begin = left, end = right;
    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** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){

    QuickSort1(nums,0,numsSize-1);
    *returnSize = 0;
    int *path = (int *)malloc(sizeof(int)*numsSize);
    int **result = (int**)malloc(sizeof(int*)*10001);
    *returnColumnSizes = (int*)malloc(sizeof(int)*10001);
    int *pathSize = (int*)calloc(1,sizeof(int));
    int *visited = (int*)calloc(numsSize,sizeof(int));
    backtracking(nums,numsSize,0,returnSize,returnColumnSizes,path,pathSize,visited,result);
    return result;
}

2、C++

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& nums,int start,vector<bool> &visited){
        result.push_back(path);
        for(int i=start;i<nums.size();i++){
            if(i>0&&nums[i-1]==nums[i]&&visited[i-1]==false){
                continue;
            }
                path.push_back(nums[i]);
                visited[i] = true;
                backtracking(nums,i+1,visited);
                path.pop_back();
                visited[i] = false;
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<bool> visited = {false};
        sort(nums.begin(),nums.end());
        backtracking(nums,0,visited);
        return result;
    }
};

3、JAVA

class Solution { 
    LinkedList<Integer> path = new LinkedList<Integer>();
    List<List<Integer>> result = new ArrayList<>();

    void backtracking(int[] nums,int start,boolean[] visited){
        result.add(new ArrayList<>(path));
        for(int i=start;i<nums.length;i++){
            if(i>0 && nums[i-1]==nums[i] && visited[i-1] == false){
                continue;
            }
            path.addLast(nums[i]);
            visited[i] = true;
            backtracking(nums,i+1,visited);
            path.removeLast();
            visited[i] = false;
        }
        return;
    }

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        boolean[] visited = new boolean[nums.length];
        Arrays.sort(nums);
        Arrays.fill(visited,false);
        backtracking(nums,0,visited);
        return result;
    }
}

4、Python

 
class Solution(object):
    def __init__(self):
        self.path = []
        self.result = []

    def backtracing(self,nums,start,visited):
        self.result.append(self.path[:])
        for i in range(start,len(nums)):
            if i>0 and nums[i-1]==nums[i] and visited[i-1]==False:
                continue
            self.path.append(nums[i])
            visited[i] = True
            self.backtracing(nums,i+1,visited)
            self.path.remove(nums[i])
            visited[i] = False;

    def subsetsWithDup(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        visited = [False]*len(nums)
        nums.sort()
        self.backtracing(nums,0,visited)
        return self.result

标签:nums,int,self,II,算法,子集,result,path,visited
From: https://www.cnblogs.com/cmkbk/p/17530192.html

相关文章

  • 哨兵 查找算法_右手 深度
    1importnumpyasnp23#生成一个10*10全为0的array45maze=np.zeros((10,10),dtype=int)6#给array使用数字9包围7#添加行8maze=np.insert(maze,0,np.full(10,9,dtype=int),axis=0)9maze=np.insert(maze,len(maze),np.full(10,9,dt......
  • Miller_Rabin算法快速判断大数是否为素数
    Miller_Rabin算法快速判断大数是否为素数并不是绝对,这只是一种判断大概率为素数的方法首先根据费马小定理有:\(a^{p-1}=1\pmodp(a不为p的倍数且p不是素数)\)又因为\(p\)为素奇数,所以\(p-1\)为偶数,表示为\(p-1=2^dm\)所以有\(a^{p-1}-1=0\pmodp\)\(a^{2^dm}-1=0\pmodp\)\((......
  • KMP算法
    一.引入(洛谷P3375)给出两个字符串\(s_1\)和\(s_2\),若\(s_1\)的区间\([l,r]\)子串与\(s_2\)完全相同,则称\(s_2\)在\(s_1\)中出现了,其出现位置为\(l\)。现在请你求出\(s_2\)在\(s_1\)中所有出现的位置。\(s1\)称为文本串,\(s2\)称为模板链二.简陋版本不难......
  • Pollard-Rho 分解算法学习笔记
    Pollard-Rho分解算法Pollard-Rho算法是一种用于快速找到\(n\)的一个非平凡约数的方法。生日悖论在不少于\(23\)个人中至少有两人生日相同的概率已经大于\(50\%\)。更一般的形式,随机选取在\(\left[1,N\right]\)范围内的整数,期望到第\(O(\sqrt{N})\)个出现重复。用下面的方......
  • 阵列信号处理及matlab仿真-------波束形成算法基础知识以及MMSE、MSNR和LCMV的MATLAB
    上一篇《阵列信号处理及MATLAB仿真-----阵列信号绪论》里面说了阵列信号处理研究的四个主要问题:波束形成技术、空间谱估计、信号源定位、信源分离。接下来我们就波束形成来做一个详细的学习。一、波束形成的定义:首先说一下它的物理意义,阵列天线的方向图是全方向的,但是......
  • 网络2️⃣HTTPS-密钥交换算法
    SSL/TLSHTTPS是在TCP和HTTP之间添加SSL/TLS安全协议,解决HTTP的安全性问题。在HTTP中,通信之前需要进行TLS握手。密钥交换算法:不同密钥交换算法的TLS握手流程不同。RSA:简单,但存在前向安全问题(如果服务端私钥泄漏,过去被第三方截获的所有TLS通讯密文都会被......
  • 2023.7.8 两数之和II
    典中典,没啥好说的,主要练习一下Rust的二分查找API。implSolution{pubfntwo_sum(numbers:Vec<i32>,target:i32)->Vec<i32>{letn=numbers.len();for(i,x)innumbers.iter().enumerate(){lety=numbers.binary_search(&......
  • 【算法】根据二叉树的级别返回排序后的元素列表
    根据给定的Node树节点,返回包含按级别排序的树中元素的列表,这意味着根元素位于第一位,然后根子元素(从左到右)位于第二位和第三位,依此类推。1publicclassNode2{3publicNodeLeft;4publicNodeRight;5publicintValue;67publicNode(No......
  • 手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实
    手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实体识别、CypherCheetsheet详细教学等效果预览:1.知识图谱存储方式知识图谱存储方式主要包含资源描述框架(ResourceDescriptionFramework,RDF)和图数据库(GraphDatabase)。1.1资源描述框......
  • 167. 两数之和 II - 输入有序数组
    给你一个下标从1开始的整数数组 numbers,该数组已按非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target的两个数。如果设这两个数分别是numbers[index1]和numbers[index2],则1<=index1<index2<=numbers.length。以长度为2的整数数组[index1,i......