我在 C# leetcode TwoSum 中遇到了逻辑问题。重复数字的最后一种情况是返回错误的索引

I have a logic problem in C# leetcode TwoSum. The last case with repeated numbers is returning the wrong index

提问人:Araujo Red 提问时间:11/10/2023 最后编辑:Heretic MonkeyAraujo Red 更新时间:11/10/2023 访问量:44

问:

质询要求函数应返回两个数字的两个索引,这两个索引加起来等于目标数字。它接收一个数组并返回一个包含两个索引的数组。

我的解决方案:

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])nextsolution[1]

C# 逻辑

评论

0赞 Heretic Monkey 11/10/2023
这是针对该问题的 dotnetfiddle
0赞 Dmitry Bychenko 11/10/2023
for (int innerIndex = index + 1; innerIndex < numsTemp.Length; innerIndex++)

答:

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};  
}