publicclassSolution { public IList<IList<int>> PermuteUnique(int[] nums) { } }
#解題
案例一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
[TestMethod] publicvoid PermuteUniqueTest_輸入1_1() { //arrange var sut = new Solution(); int[] input = newint []{ 1, 1 }; var expected = new List<List<int>> { new List<int>{ 1,1} }; //act var actual = sut.PermuteUnique(input);
publicpartialclassSolution { public IList<IList<int>> PermuteUnique(int[] nums) { var Result = new List<IList<int>>(); Result.Add(nums.ToList()); return Result; } }
案例二
1 2 3 4 5 6 7 8 9 10 11 12 13 14
[TestMethod] publicvoid PermuteUniqueTest_輸入空Array() { //arrange var sut = new Solution(); int[] input = newint[0]; var expected = new List<List<int>>();
public IList<IList<int>> PermuteUnique(int[] nums) { var Result = new List<IList<int>>();
if (nums.Length == 0) return Result;
Result.Add(nums.ToList());
return Result; }
案例三
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[TestMethod] publicvoid PermuteUniqueTest_輸入1_2() { //arrange var sut = new Solution(); int[] input = newint[] { 1, 2 }; var expected = new List<List<int>> { new List<int>{ 1,2}, new List<int>{ 2,1} };
[TestMethod] publicvoid PermuteUniqueTest_輸入1_2_3() { //arrange var sut = new Solution(); int[] input = newint[] { 1, 2 , 3}; var expected = new List<List<int>> { new List<int>{ 1,2,3}, new List<int>{ 1,3,2}, new List<int>{ 2,1,3}, new List<int>{ 2,3,1}, new List<int>{ 3,1,2}, new List<int>{ 3,2,1}, };
publicpartialclassSolution { public IList<IList<int>> PermuteUnique(int[] nums) { var Result = new List<IList<int>>();
if (nums.Length == 0) return Result;
Result.Add(nums.ToList());
for (int i = 0; i < nums.Length; i++) { if (i == nums.Length - 1) continue;
for (int s = i + 1 ; s < nums.Length; s++) { if (nums[i] != nums[s]) { var SplitLeaft = new List<int>(nums); Swap(SplitLeaft, i, s); Recursive(SplitLeaft, i + 1, Result); } } }
return Result; }
privatevoidRecursive(List<int> nums, int start, List<IList<int>> result) { result.Add(nums); for (int i = start; i < nums.Count; i++) { if (i == nums.Count - 1) continue;
if (nums[start] != nums[i + 1]) { var SplitLeaft = new List<int>(nums); Swap(SplitLeaft, start, i + 1); Recursive(SplitLeaft, i + 1, result); } } }
privatevoidSwap(List<int> nums, int index1,int index2) { var Temp = nums[index1]; nums[index1] = nums[index2]; nums[index2] = Temp; } }
publicpartialclassSolution { public IList<IList<int>> PermuteUnique(int[] nums) { var Result = new List<IList<int>>();
if (nums.Length == 0) return Result;
Recursive(new List<int>(nums), 0 , Result);
return Result; }
privatevoidRecursive(List<int> nums, int start, List<IList<int>> result) { result.Add(nums); for (int i = start; i < nums.Count; i++) { if (i == nums.Count - 1) { continue; }
for (int j = i + 1; j < nums.Count; j++) { if (nums[i] != nums[j]) { var SplitLeaft = new List<int>(nums); Swap(SplitLeaft, i, j); Recursive(SplitLeaft, i + 1, result); } } } }
privatevoidSwap(List<int> nums, int index1,int index2) { var Temp = nums[index1]; nums[index1] = nums[index2]; nums[index2] = Temp; } }
案例五
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
[TestMethod] publicvoid PermuteUniqueTest_輸入1_1_2() { //arrange var sut = new Solution(); int[] input = newint[] { 1, 1, 2 }; var expected = new List<List<int>> { new List<int>{ 1,1,2}, new List<int>{ 1,2,1}, new List<int>{ 2,1,1} };
[TestMethod] publicvoid PermuteUniqueTest_輸入2_2_1_1() { //arrange var sut = new Solution(); int[] input = newint[] { 2, 2, 1, 1 }; var expected = new List<List<int>> { new List<int>{ 1,1,2,2}, new List<int>{ 1,2,1,2}, new List<int>{ 1,2,2,1}, new List<int>{ 2,1,1,2}, new List<int>{ 2,1,2,1}, new List<int>{ 2,2,1,1} };
public IList<IList<int>> PermuteUnique(int[] nums) { var Result = new List<IList<int>>();
if (nums.Length == 0) return Result;
Recursive(new List<int>(nums), 0 , Result);
return Result; }
privatevoidRecursive(List<int> nums, int start, List<IList<int>> result) { result.Add(nums); for (int i = start; i < nums.Count; i++) { HashSet<int> used = new HashSet<int>(); if (i == nums.Count - 1) { continue; }
for (int j = i + 1; j < nums.Count; j++) { if (nums[i] != nums[j]) { if (used.Contains(nums[j])) { continue; } else { used.Add(nums[j]); }
var SplitLeaft = new List<int>(nums); Swap(SplitLeaft, i, j); Recursive(SplitLeaft, i + 1, result); } } } }
privatevoidSwap(List<int> nums, int index1,int index2) { var Temp = nums[index1]; nums[index1] = nums[index2]; nums[index2] = Temp; }