找出数组中一个任意重复的数字
https://blog.csdn.net/minghui_/article/details/80542760
这个不错
方法一:排序+扫描 时间nlogn
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int same;
for (int i = 0; i < nums.size(); i++)
{
same = nums[i];
if (i != 0 && same == nums[i-1])
{
return nums[i];
}
}
return -1;
}
};
或者排序后计数 数量大于一的输出
方法二:哈希表 时间o(n)
使用哈希表把遍历过的元素存下来,如果发现一次就记录1,发现两次就记录2,并且每次遍历检查,如果大于等于2了,就返回该重复的数字(因为只用返回任意一个重复数字)
https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/mian-shi-ti-03-shu-zu-zhong-zhong-fu-de-shu-zi-yua/
这个写得好
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
unordered_map<int, bool> map;
for(int num : nums) {
if(map[num]) return num;//如果哈希表里有这个数 就return
map[num] = true;//没有就加入哈希表
}
return -1;
}
};
上述代码中
for (auto x : nums)
作用就是迭代容器中所有的元素,每一个元素的临时名字就是x,等同于下边代码
for (vector<int>::iterator iter = nums.begin(); iter != nums.end(); iter++)
方法三:原地交换
题目说明尚未被充分使用,即 在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内 。 此说明含义:数组元素的 索引 和 值是 一对多 的关系。
因此,可遍历数组并通过交换操作,使元素的 索引 与 值 一一对应(即 nums[i] = i)。因而,就能通过索引映射对应的值,起到与字典等价的作用。
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int i = 0;
while(i < nums.size()) {
if(nums[i] == i) {
i++;
continue;
}
if(nums[nums[i]] == nums[i])
return nums[i];
swap(nums[i],nums[nums[i]]);
}
return -1;
}
};
作者:jyd
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/mian-shi-ti-03-shu-zu-zhong-zhong-fu-de-shu-zi-yua/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这个道理懂了 程序还应多看看