首页 > 编程语言 >四种语言刷算法之47. 全排列 II

四种语言刷算法之47. 全排列 II

时间:2023-02-25 09:55:06浏览次数:47  
标签:nums int 47 back II 算法 result path visited

47. 全排列 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 back(int* nums, int numsSize, int* returnSize, int** returnColumnSizes,int *path,int *pathSize,int **result,int *visited){
    if(numsSize==*pathSize){
        result[*returnSize] = (int *)malloc(sizeof(int)*numsSize);
        memcpy(result[*returnSize],path,sizeof(int)*numsSize);
        (*returnColumnSizes)[*returnSize] = numsSize;
        (*returnSize)++;
        return;
    }
    for(int i=0;i<numsSize;i++){
        if(visited[i]==1||(i>0&&nums[i-1]==nums[i]&&visited[i-1]==0)){
            continue;
        }
        path[*pathSize] = nums[i];
        visited[i] = 1;
        (*pathSize)++;
        back(nums,numsSize,returnSize,returnColumnSizes,path,pathSize,result,visited);
        visited[i] = 0;
        (*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** permuteUnique(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    QuickSort1(nums,0,numsSize-1);
    *returnSize = 0;
    *returnColumnSizes = (int *)malloc(sizeof(int)*100001);
    int *path = (int *)malloc(sizeof(int)*numsSize);
    int **result = (int **)malloc(sizeof(int *)*100001);
    int *visited = (int *)calloc(numsSize,sizeof(int));
    int *pathSize = (int *)calloc(1,sizeof(int));
    back(nums,numsSize,returnSize,returnColumnSizes,path,pathSize,result,visited);
    return result;

}

2、C++

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

3、JAVA

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    void back(int[] nums,boolean[] visited){
        if(nums.length == path.size()){
            result.add(new ArrayList<>(path));
            return;
        }
        for(int i=0;i<nums.length;i++){
            if(visited[i]){continue;}
            if(i>0&&nums[i-1]==nums[i]&&visited[i]==false&&visited[i-1]==false){
                continue;
            }
                visited[i] = true;
                path.add(nums[i]);
                back(nums,visited);
                path.removeLast();
                visited[i] = false;
        }
    }
    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        boolean visited[] = new boolean[nums.length];
        Arrays.fill(visited,false);
        back(nums,visited);
        return result;
    }
}

4、Python

class Solution(object):
    def __init__(self):
        self.path = []
        self.result = []
    def back(self,nums,visited):
        if len(nums)==len(self.path):
            self.result.append(self.path[:])
            return
        for i in range(len(nums)):
            if visited[i]==True:
                continue
            if i>0 and nums[i-1]==nums[i] and visited[i-1]==False:
                continue
            visited[i]=True
            self.path.append(nums[i])
            self.back(nums,visited)
            self.path.pop()
            visited[i]=False
        
    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        visited = [False]*len(nums)
        self.back(nums,visited)
        return self.result

 

标签:nums,int,47,back,II,算法,result,path,visited
From: https://www.cnblogs.com/cmkbk/p/16984743.html

相关文章

  • 算法笔记目录
    ├─语言├─模拟├─字符串│├─字符串基础│├─manacher│├─kmp│├─trie│├─ac自动机│├─后缀数组(sa)│├─后......
  • [LeetCode] 1247. Minimum Swaps to Make Strings Equal
    Youaregiventwostrings s1 and s2 ofequallengthconsistingofletters "x" and "y" only.Yourtaskistomakethesetwostringsequaltoeachother.......
  • 【C语言经典算法100道实战题】学习资料大全
    ​【C语言经典算法100道实战题】适合具备C语言基础语法的同学学习,提高编写程序的逻辑思维能力和算法设计能力专门精心设计。100个经典的算法供大家练习及配套对应的录播视......
  • 吴恩达改善深层神经网络——超参数调试、正则化及优化算法
    1.数据集划分对于一个需要解决的问题的样本数据,在建立模型的过程中,数据会被划分为以下几个部分:训练集(trainset):用训练集对算法或模型进行训练过程;验证集(developments......
  • m基于改进PSO粒子群优化的RBF神经网络解耦控制算法matlab仿真
    1.算法描述智能控制的思想最早来自傅京孙教授[,他通过人机控制器和机器人方面的研究,首先把人工智能的自觉推理方法用于学习控制系统,将智能控制概括为自动控制和人工智能的结......
  • Day 23 23.1:js加密算法
    js加密算法逆向重点掌握的内容:1.逆向的思维2.网站逆向的分析思路和步骤注意:重点不是放在代码中,而是分析的思路和套路(技巧)逆向到底是什么?通俗来讲,逆向就是处理爬虫过......
  • 2023算法笔记
    Hoppz算法笔记前言2023_02_18还是太菜了,笔记基于《算法导论》&&《数据结构与算法分析C++描述》,想着为复试准备(虽然很大程度上今年是考不上了),就开始重看算法导论,前......
  • J2、ResNet50V2算法实战与解析
     ......
  • m基于改进PSO粒子群优化的RBF神经网络解耦控制算法matlab仿真
    1.算法描述        智能控制的思想最早来自傅京孙教授[,他通过人机控制器和机器人方面的研究,首先把人工智能的自觉推理方法用于学习控制系统,将智能控制概括为自动......
  • 代码随想录算法Day24 | 回溯算法理论基础,77.组合
    回溯算法理论基础回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯法通常使用递归来实现,在递归过程中不断尝试各种可能的解决方案,如果发现当前的解决方案不可行,就回溯......