力扣(LeetCode)47

15次阅读

共计 981 个字符,预计需要花费 3 分钟才能阅读完成。

题目地址:https://leetcode-cn.com/probl… 题目描述:给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出:[[1,1,2], [1,2,1], [2,1,1]] 解答:这一题可以利用求下一个排列算法来求解,对原数组排序,然后加入一个结果,接着不断求下一个排列,直到没有下一个排列为止。而下一个排列的求解, 可以参考下一个排列
java ac 代码:
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>>ans = new ArrayList(1000);
Arrays.sort(nums);
List<Integer> temp = new ArrayList();
for(int i = 0;i < nums.length;i++)
temp.add(nums[i]);
ans.add(temp);

while(true)
{
temp = nextpermute(nums);
if(temp.size() > 0)
ans.add(temp);
else break;
}
return ans;
}

List<Integer> nextpermute(int[]nums)
{
List<Integer>ans = new ArrayList(nums.length);
for(int i = 0;i < nums.length-1;i++)
if(nums[i]<nums[i+1])
{
int j = nums.length-1;
while(true)
{
if(nums[j-1] < nums[j])
break;
j–;
}
int k = nums.length-1;
while(true)
{
if(nums[k] > nums[j-1])
{
swap(nums,j-1,k);
int l = j,r = nums.length-1;
while(l < r)
{
swap(nums,l,r);
l++;
r–;
}
for(int q = 0;q < nums.length;q++)
ans.add(nums[q]);
break;
}
k–;
}

break;
}
return ans;
}

void swap(int[]nums,int i,int j)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}

正文完
 0