参考算法描述
public static void nextPermutation(int[] nums) {
int j = nums.length - 1;
int i = j-1;
while (i >= 0)
{
if (nums[i] < nums[j])
break;
i--;
j--;
}
if (i != -1) // 没有查找到顺序对,应该返回最开始的一组数据
{
int k = nums.length - 1;
while (k > i)
{
if (nums[k] > nums[i])
break;
k--;
}
k = k == nums.length ? k - 1 : k;
int tmp = nums[i];
nums[i] = nums[k];
nums[k] = tmp;
}
int end = nums.length - 1;
while (j < end)
{
int tmp2 = nums[j];
nums[j] = nums[end];
nums[end] = tmp2;
end--;
j++;
}
}
另外字典序全排列代码如下:
private static void dfs(int[] nums, int deep, List<List<Integer>> list, List<Integer> ret, boolean[] rem) {
if (deep == nums.length)
{
List<Integer> copy = new ArrayList<Integer>();
copy.addAll(ret);
list.add(copy);
return;
}
for (int i = 0; i < nums.length; i++)
{
if (!rem[i]) // 没有被访问过
{
rem[i] = true;
ret.add(deep, i+1);
dfs(nums, deep+1, list, ret, rem); // 最后一个位置返回
if (ret.size() > deep)
ret.remove(deep); // 删除最后一个元素
rem[i] = false;
}
}
}