Loading... <p>给定一个长度为 n 的整数数组 <code>nums</code>,数组中所有的数字都在 <strong>0∼n−1</strong> 的范围内。</p> <p>数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。</p> <p>请找出数组中任意一个重复的数字。</p> <p><strong>注意</strong>:如果某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,则返回 -1;</p> <h3 id="toc_0"><strong>样例</strong></h3> <pre><code class="language-cpp">给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。 返回 2 或 3。 </code></pre> <p><div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-88ee7365ca479d2c9069b10bf49b63ae64" aria-expanded="true"><div class="accordion-toggle"><span>参考答案</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-88ee7365ca479d2c9069b10bf49b63ae64" class="collapse collapse-content"></p> <pre><code class="language-cpp">class Solution { public: int duplicateInArray(vector<int>& nums) { int n = nums.size(); // 要提前遍历一次 for(auto item:nums) if (item < 0 || item > n) return -1; for (int i = 0; i < n; i++) { // 三种情况 // 一 遍历坑位与所含数字相符,直接路过 i++ // 二 遍历坑位与所含数字不符,同时目标坑位也不符,则交换 // 三 遍历坑位与所含数字不符,目标坑位相符,则有重复数字,返回 // 遍历的坑位和目标坑位都与所含数字不符 // 是 while 一直交换,直到遍历坑位相符,或者目标坑位相符 // 而当目标坑位相符,而遍历坑位不符时,在下个 if 语句 return while (nums[i] != i && nums[nums[i]] != nums[i]) swap(nums[i], nums[nums[i]]); // 遍历坑位与所含数字不符,目标坑位相符,则有重复数字 if (nums[i] != i && nums[nums[i]] == nums[i]) return nums[i]; } return -1; } };``` <div style="height: 15px"></div></div></div></div> </code></pre> 最后修改:2021 年 05 月 12 日 10 : 55 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 ×Close 赞赏作者 扫一扫支付