p11 无重复元素的数组全排列 (leetcode46)

一:解题思路

这道题目回溯的思想来做,代码表现的方式为递归。Time:O(n*n!),Space:O(n)

二:完整代码示例

C++版:

class Solution {
public:
    void permuteRec(vector<int>& nums, int start, vector<vector<int>>& result)
    {
        if (start == nums.size())
        {
            result.push_back(nums);
        }
        else
        {
            for (int i = start; i < nums.size(); i++)
            {
                swap(nums[start],nums[i]);
                permuteRec(nums,start+1,result);
                swap(nums[start],nums[i]);
            }
        }
    }

    vector<vector<int>> permute(vector<int>& nums) 
    {
        vector<vector<int>> result;
        if (nums.size() == 0) return result;

        permuteRec(nums,0,result);

        return result;
    }
};

Java版:

 

class Solution {
        private void permuteRec(List<Integer> nums,int start,List<List<Integer>> result)
        {
            if(start==nums.size())
            {
                result.add(new ArrayList<>(nums));
            }
            else
            {
                for(int i=start;i<nums.size();i++)
                {
                    Collections.swap(nums,i,start);
                    permuteRec(nums,start+1,result);
                    Collections.swap(nums,i,start);
                }
            }
        }
        public List<List<Integer>> permute(int[] nums)
        {
               if(nums==null||nums.length==0) return new ArrayList<>();
               List<List<Integer>> result=new ArrayList<>();
               
               List<Integer> list=new ArrayList<>();
               for(int num:nums) list.add(num);

               permuteRec(list,0,result);
               
               return result;
        }
    }

把这个题目稍微改编一下,把题目中的重复数字这个条件给去掉(数组中可能存在重复的数字),求所有可能不重复的情况?代码如下:

class Solution {
public:
    void permuteRec(vector<int>& nums, int start, vector<vector<int>>& result)
    {
        if (start == nums.size())
        {
            result.push_back(nums);
        }
        else
        {
            for (int i = start; i < nums.size(); i++)
            {
                if (nums[i] != nums[start] || i==start)
                {
                    swap(nums[start], nums[i]);
                    permuteRec(nums, start + 1, result);
                    swap(nums[start], nums[i]);
                }
            }
        }
    }

    vector<vector<int>> permute(vector<int>& nums) 
    {
        vector<vector<int>> result;
        if (nums.size() == 0) return result;

        permuteRec(nums,0,result);

        return result;
    }
};

int main()
{
    Solution s;
    vector<int> v = {1,1,3};
    vector<vector<int>> ret;
    ret=s.permute(v);
    int m = ret.size();
    int n = ret[0].size();

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << ret[i][j] << " ";
        }

        cout << endl;
    }

    return 0;
}

 上述解法实际上是有问题的,来看下面这种解法,运用一个set。

leetcode 47 题。

class Solution 
{
private:
    void permute(vector<int>& nums, int start, set<vector<int>>& result)
    {
        if (start == nums.size())
        {
            result.insert(nums);
        }
        else
        {
            for (int i = start; i < nums.size(); i++)
            {
                //if ((nums[i] != nums[start]) || (i==start))
                {
                    swap(nums[start], nums[i]);
                    permute(nums, start + 1, result);
                    swap(nums[start], nums[i]);
                }
            }
        }
    }
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) 
    {
        set<vector<int>> result;
        vector<vector<int>> ret;
        if (nums.size() == 0) return ret;

        permute(nums,0,result);

        set<vector<int>>::iterator it;
        for (it = result.begin(); it != result.end(); it++)
        {
            ret.push_back(*it);
        }


        return ret;
    }
};

 

posted @ 2020-03-09 20:54  repinkply  阅读(215)  评论(0)    收藏  举报