提问人:Araujo Red 提问时间:11/10/2023 最后编辑:Heretic MonkeyAraujo Red 更新时间:11/10/2023 访问量:44
我在 C# leetcode TwoSum 中遇到了逻辑问题。重复数字的最后一种情况是返回错误的索引
I have a logic problem in C# leetcode TwoSum. The last case with repeated numbers is returning the wrong index
问:
质询要求函数应返回两个数字的两个索引,这两个索引加起来等于目标数字。它接收一个数组并返回一个包含两个索引的数组。
我的解决方案:
public int[] TwoSum(int[] nums, int target) {
var solution = new int[2];
var numsTemp = new int[nums.Length];
Array.Copy(nums, numsTemp, nums.Length);
for (int index = 0; index < numsTemp.Length; index++) {
int currentNum = numsTemp[index];
for (int innerIndex = 0; innerIndex < numsTemp.Length; innerIndex++) {
if (Array.IndexOf(nums, currentNum) != Array.IndexOf(nums, numsTemp[innerIndex])) {
int result = currentNum + numsTemp[innerIndex];
if(result == target) {
solution[0] = Array.IndexOf(nums, numsTemp[innerIndex]);
int next = 0;
if(currentNum == numsTemp[innerIndex]) {
next = Array.IndexOf(nums, numsTemp[innerIndex]) + 1;
}
solution[1] = Array.IndexOf(nums, currentNum, next);
break;
}
}
}
}
return solution;
}
上面的代码适用于具有不同数字的其他情况。但是对于数组,它返回了错误的索引。{3, 3}
在行中,我更改了变量的“if 块”中的值,因此当分配索引时,代码会查找下一个索引,并且不会再次返回前 3 个索引,显然它不起作用。有人可以帮我怎么了?if(currentNum == numsTemp[innerIndex])
next
solution[1]
答:
0赞
Dmitry Bychenko
11/10/2023
#1
经典解决方案使用某种哈希表,例如:Dictionary
public int[] TwoSum(int[] nums, int target) {
if (nums is null)
return new [] {-1, -1};
Dictionary<int, int> known = new();
for (int i = 0; i < nums.Length; ++i) {
if (known.TryGetValue(target - nums[i], out int index))
return new [] {index, i};
known.TryAdd(nums[i], i);
}
return new [] {-1, -1};
}
如果要实现嵌套循环解决方案,请注意内部索引必须大于外部索引;在您的代码中,它可以是
for (int innerIndex = index + 1; innerIndex < numsTemp.Length; innerIndex++)
然后你应该把项目加起来,而不是索引等。 小提琴nums
简化代码
public int[] TwoSum(int[] nums, int target) {
if (nums is null)
return new [] {-1, -1};
for (int outer = 0; outer < nums.Length; ++outer)
for (int inner = outer + 1; inner < nums.Length; ++inner)
if (nums[inner] + nums[outer] == target)
return new [] { outer, inner };
return new [] {-1, -1};
}
评论
for (int innerIndex = index + 1; innerIndex < numsTemp.Length; innerIndex++)