我感到非常愚蠢,但我无法弄清楚这一点。
我正在尝试解决Leetcode中的一个问题 - https://leetcode.com/problems/permutations-ii/。我遇到了一个C ++解决方案,它不知道它是如何工作的,所以我决定尝试使用调试器。 我用C#实现了它,但是得到了不同的结果。我无法弄清楚为什么,对我来说代码是一样的。
这是C ++代码:
#include <iostream> // std::cout
#include <algorithm> // std::sort
#include <vector>
using namespace std;
void sw(vector<int> &num, int i, int j) {
int tmp = num[i];
num[i] = num[j];
num[j] = tmp;
}
void recursion(vector<int> num, int i, int j, vector<vector<int> > &res)
{
if (i == j - 1) {
res.push_back(num);
return;
}
for (int k = i; k < j; k++) {
if (i != k && num[i] == num[k]) continue;
sw(num, i, k);
recursion(num, i + 1, j, res);
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(), num.end());
vector<vector<int> >res;
recursion(num, 0, num.size(), res);
return res;
}
int main()
{
int myints[] = { 1, 1, 2 };
std::vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));
auto r = permuteUnique(fifth);
cout << "Count: " << r.size() << "; " ;
return 0;
}
投放结果为:[1, 1, 2]
,[1, 2, 1]
,[2, 1, 1]
这是C#代码:
public class T47_Permutations_Unique
{
public static IList<IList<int>> PermuteUnique(int[] nums)
{
if (nums == null || nums.Length == 0)
{
return null;
}
IList<IList<int>> result = new List<IList<int>>();
Array.Sort(nums);
ComputeInternal(nums, result, 0, nums.Length);
return result;
}
private static void ComputeInternal(int[] num, IList<IList<int>> result, int i, int j)
{
if (i == j-1)
{
var row = new List<int>();
for (int z = 0; z < num.Length; z++)
{
row.Add(num[z]);
}
result.Add(row);
return;
}
for (int k = i; k < j; k++)
{
if (i != k && num[i] == num[k])
{
continue;
}
Swap(num, i, k);
ComputeInternal(num, result, i + 1, j);
}
}
private static void Swap(int[] input, int i, int j)
{
var tmp = input[i];
input[i] = input[j];
input[j] = tmp;
}
}
[Fact]
public void SmokeTest()
{
var input = new int[] {1, 1, 2};
var result = T47_Permutations_Unique.PermuteUnique(input);
Assert.Equal(3, result.Count);
}
结果是(5个元素而不是3个元素):[1, 1, 2]
,[1, 2, 1]
,[2, 1, 1]
,[1, 1, 2]
,[1, 2, 1]
两个应用程序基本相同,为什么结果会有差异?