本文共 983 字,大约阅读时间需要 3 分钟。
题目:
解答:
和上一题一样思路,多加一个剪枝,剪枝的方法是,当和后面的数进行交换时,如果在前面交换过相同的数,那么这个数就不需要进行交换了。
参考:
http://blog.csdn.net/xx77009833/article/details/17843415
http://www.cnblogs.com/TenosDoIt/p/3662644.html
代码:
class Solution { public: vector> permuteUnique(vector &num) { int size = num.size(); vector > res; per(num, res, 0); return res; } private: void per(vector &num, vector > &res, int k) { if (k == num.size()) { if (find(res.begin(), res.end(), num) == res.end()) res.push_back(num); } for (int i = k; i < num.size(); i++) { if (findD(num, k, i, num[i])) continue; else { swap(num[k], num[i]); per(num, res, k + 1); swap(num[k], num[i]); } } } bool findD(vector num, int start, int end, int target) { for (int i = start; i < end; i++) { if (num[i] == target) return true; } return false; } void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; } };