Skip to main content
  1. Posts/

leetcode 287. Find the Duplicate Number (floyd判圈算法找重复元素)

Note: This article is available in Chinese only. 本文暂无英文版本。 View original

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.

Note:

  1. You **must not** modify the array (assume the array is read only).
  2. You must use only constant, _O_(1) extra space.
  3. Your runtime complexity should be less than `O(n2)`.
  4. There is only one duplicate number in the array, but it could be repeated more than once.

思路:O(n^2)的复杂度暴力即可,说个O(n)复杂度的解法。

需要注意元素范围1..n是个很重要的条件。

使得我们可以把位置和元素映射起来。

可以看成一个迭代函数

由于存在重复重复元素,因此一定存在一个环。

因此可以用floyd判圈算法。

floyd判圈算法_维基百科

这算法以前遇到过sgu455 解题报告,所以不算很陌生…

但是从有重复元素没有联想到会有环orz,我好菜啊…

 1/* ***********************************************
 2Author :111qqz
 3Created Time :2017年04月05日 星期三 15时16分11秒
 4File Name :287.cpp
 5************************************************ */
 6/* ***********************************************
 7Author :111qqz
 8Created Time :2017年04月05日 星期三 14时58分11秒
 9File Name :287.cpp
10************************************************ */
11class Solution {
12
13public:
14
15    int findDuplicate(vector<int>& nums) {
16    int slow = nums[0];
17    int fast = nums[nums[0]];
18    while (slow!=fast)
19    {
20        slow = nums[slow];
21        fast = nums[nums[fast]];
22
23        printf("slow:%d fast:%d\n",slow,fast);
24    }
25    fast = 0 ;
26    while (fast != slow)
27    {
28        fast = nums[fast];
29        slow = nums[slow];
30    }
31    return slow;
32
33    }
34
35};

Related

今日头条2017秋招笔试_1

·2 mins
头条校招(今日头条2017秋招真题) 题目描述 头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队。每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来。在选题之前,我们对题目进行了盲审,并定出了每道题的难度系数。一场考试包含3道开放性题目,假设他们的难度从小到大分别为a, b, c,我们希望这3道题能满足下列条件:

今日头条笔试题-木棒拼图(数学)

·2 mins
有一个由很多木棒构成的集合,每个木棒有对应的长度,请问能否用集合中的这些木棒以某个顺序首尾相连构成一个面积大于 0 的简单多边形且所有木棒都要用上,简单多边形即不会自交的多边形。

今日头条笔试题-最大映射(贪心)

·3 mins
有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大? 输入描述:每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母。 输出描述:输出一个数,表示最大和是多少。 输入例子: 2 ABC BCA 输出例子: 1875 一开始看漏了首位不能映射到0的条件…直接贪了..结果发现不太对…