【问题标题】:Find Duplicate in Mutable Array with Only 1 Repeating element在只有 1 个重复元素的可变数组中查找重复项
【发布时间】:2021-07-10 07:58:51
【问题描述】:

nums 是一个大小为 N+1 的数组,元素范围从 1 到 N,只有一个重复元素。 为什么我们在下面的代码中在nums[ abs( nums[i] ) - 1 ]中使用-1

class Solution {
public:
    int findDuplicate(vector<int>& nums) {

        for (int i = 0; i < nums.size(); ++i)
        {
            if (nums[abs(nums[i]) - 1 ] >= 0)
                nums[abs(nums[i]) - 1 ] = -nums[abs(nums[i]) - 1];
            else
                return abs(nums[i]);
        }
        return 0;
    }
};

这段代码的逻辑是遍历每个元素并将其设为负数,如果遇到已经为负数的元素,那就是重复的,但我不明白为什么在我做空运行时我们在这里使用-1在纸上我得到错误的答案

【问题讨论】:

  • 请告诉我们更多关于nums 的期望以及您正在查看的竞争代码挑战网站上的问题。
  • 答案在你没有告诉我们的那部分问题——数组中值的范围。

标签: c++ data-structures


【解决方案1】:

在您解决问题时,您没有向我们提供足够的信息。至于解释你问题的具体部分,假设nums包含像nums[i] &lt; 0 &amp;&amp; abs(nums[i]) &lt;= nums.size()这样的数据

我从nums[ abs( nums[i] ) - 1 ] 这一行得到的,这意味着abs(num[i]) 必须小于等于nums.size()。所以如果abs(nums[i]) == nums.size(),您将访问超出范围的数组。所以nums[ abs( nums[i] ) - 1 ]保持数字在nums.size() - 1的范围内。

【讨论】:

  • 如果nums[i]0 怎么办?我认为我们对nums 了解不够。
  • 是的,没错。假设如果数字是 num[i]
  • nums 是一个大小为 N+1 的数组,元素范围从 1 到 N,只有一个重复元素。我已经编辑了问题谢谢您的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 2017-07-24
  • 2011-06-06
  • 2017-08-18
  • 2015-11-24
相关资源
最近更新 更多