LeetCode---Permutations

題目大意:給出一個數組,求出數組中元素的所有排列。
算法思想:
1.首先將數組升序排序,並將結果放入集合中。
2.然後利用STL中的next_permutation()算法求出數組中元素的所有排列。

代碼如下:

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int> >res;
        if(nums.size()==0) return res;
        sort(nums.begin(),nums.end());
        res.push_back(nums);
        while(next_permutation(nums.begin(),nums.end())){
            res.push_back(nums);
        }
        return res;
    }
};

解法二(字典序求解全排列法):

1.將所給的字符串排序。

2.找出p=max{i|a[i]<a[j]}

3.找出q=max{j|a[p]<a[j]}

4.swap(a[p],a[q])

5.將a[p+1]後的所有元素倒序.

6按2~5找出所有的排列。

代碼如下:

class Solution {
public:
	vector<vector<int>> permute(vector<int>& nums) {
		vector<vector<int> > res;
		if (nums.size() == 0) return res;
		sort(nums.begin(),nums.end());
		int n = nums.size();
		res.push_back(nums);
		while (1){
			int p = -1, q = -1;
			for (int i = n - 2; i >= 0; --i){//1.從右向左尋找p=max{i|a[i]<a[i+1]}
				if (nums[i] < nums[i + 1])
				{
					p = i;
					break;
				}
			}
			if (p != -1){//存在下一個排列
				for (int j = n - 1; j >p; --j){//2.從右向左尋找q=max{j|a[i]<a[j]}
					if (nums[p] < nums[j])
					{
						q = j;
						break;
					}
				}
				swap(nums[p], nums[q]);//3.交換a[p]a[q]
				int start = p+1, end = n - 1;
				while (start < end){//4.將a[p+1]之後的元素倒序
					swap(nums[start], nums[end]);
					++start;
					--end;
				}
				res.push_back(nums);
			}
			else//不存在下一個排列了
				break;
		}
			return res;
	}
};



發佈了193 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章