Permutations I(II) 数组的全排列
来源:互联网 发布:网络英语学习平台 编辑:程序博客网 时间:2024/05/22 05:19
题目
Given a collection of numbers, return all possible permutations.
For example,[1,2,3]
have the following permutations:[1,2,3]
, [1,3,2]
, [2,1,3]
, [2,3,1]
, [3,1,2]
, and [3,2,1]
.
思路:递归
class Solution {public: vector<vector<int> > permute(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int> > result; myfun(result,num,0); return result; } void myfun(vector<vector<int> > &result, vector<int> &num, int k) { if(k==num.size()-1) result.push_back(num); else { for(int i=k;i<num.size();i++) { int tmp = num[i]; num[i] = num[k]; num[k] = tmp; myfun(result,num,k+1); tmp = num[i]; num[i] = num[k]; num[k] = tmp; } } } };
如果元素有重复,则需要加入判断才可以,往下递归。
class Solution {public: vector<vector<int> > permuteUnique(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int> > result; myfun(result,num,0); return result; } void myfun(vector<vector<int> > &result, vector<int> &num, int k) { if(k==num.size()-1) result.push_back(num); else { for(int i=k;i<num.size();i++) { if(isunique(num,k,i)) { int tmp = num[i]; num[i] = num[k]; num[k] = tmp; myfun(result,num,k+1); tmp = num[i]; num[i] = num[k]; num[k] = tmp; } } } } bool isunique(vector<int> &num, int k,int i) { for(int j=k;j<i;j++) if(num[j]==num[i]) return false; return true; }};
最新 java
public class Solution { public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> result = new ArrayList<List<Integer>>(); if(nums.length == 0){ return result; } permute(nums, 0, result); return result; } public void permute(int[] nums, int cur, List<List<Integer>> result) { if(cur >= nums.length){ List<Integer> list = convertArrayToList(nums); result.add(list); } for(int i=cur; i<nums.length; i++){ if(!isuniq(nums, cur, i)){ continue; } int temp = nums[cur]; nums[cur] = nums[i]; nums[i] = temp; permute(nums, cur+1, result); temp = nums[cur]; nums[cur] = nums[i]; nums[i] = temp; } } private ArrayList<Integer> convertArrayToList(int[] num) { ArrayList<Integer> item = new ArrayList<Integer>(); for (int h = 0; h < num.length; h++) { item.add(num[h]); } return item; } private boolean isuniq(int[] nums, int from, int to){ for(int i=from; i<to; i++){ if(nums[i] == nums[to]){ return false; } } return true; }}
我也试过其他的思路,但是都失败了。
class Solution {public: vector<vector<int> > permute(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int> > result; bool flag = true; result.push_back(num); int i=0; for(int i=1;i<num.size()-1;i++) { for(int j=0;j<num.size()-i;j++) { int tmp = num[j]; num[j] = num[j+i]; num[j+i] = tmp; result.push_back(num); tmp = num[j]; num[j] = num[j+i]; num[j+i] = tmp; } } return result; }};
上述迭代遍历的代码对于[1,2,3] 返回结果是[[1,2,3],[2,1,3],[2,3,1],[1,3,2]] 而真实结果是[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]改进还在继续。
- Permutations I(II) 数组的全排列
- leetcode 46,47. Permutations I/II 全排列问题 java
- leetcode46/47-Permutations I/II(全排列问题)
- Leetcode:Permutations 数组的全排列
- 字符串算法——有重复字符的数组或字符串全排列(Permutations II)
- Permutations II 字符全排列 去除重复的
- LintCode/LeetCode全排列系列问题--Permutations I 和 II, N-Queens I 和 II,数独问题
- Permutations 数字的全排列
- Permutations II 排列II
- Permutations II:有重复元素的排列
- LeetCode (18) Permutations I & II (排列一、二)
- Leetcode #47. Permutations II 全排列2 解题报告
- leetcode-47. Permutations II(重复元素全排列)
- LeetCode(Permutations) 数列的全排列
- 全排列生成 Permutations
- 全排列(permutations)
- 全排列Permutations
- LeetCode--Permutations 全排列
- Android Jni开发环境搭建完整版
- zoj 3724 树状数组经典
- DP_各种背包专辑
- oracle主键自增长
- RFC浏览器
- Permutations I(II) 数组的全排列
- C# 如何让TextBox只允许输入数字
- 杭电1018-Big Number
- CBO学习----02--表扫描(Tablescans)
- php的pear包管理器下载pear包
- python制作的google map分片下载工具
- SecureCRT基本配置
- 设计模式——(Abstract Factory)抽象工厂
- QTP 菜单项消失的解决办法