2020-09-04

tech2025-12-30  3

方案1:先排序,再查找。先将数组排序,然后比较相邻元素,如果相等就找到重复数,时间复杂度为O(nlogn)。

class Solution { public: int findRepeatNumber(vector<int>& nums) { int size = nums.size(); sort(nums.begin(), nums.end()); // 对nums进行升序排序 for(int i=0; i<size; ++i) { // 排好序之后找重复元素就很容易了 if(nums[i] == nums[i+1]) return nums[i]; } return -1; } };

方案2:借用一个哈希表来查找。首先遍历整个数组,每遍历一个元素都与哈希表中的值比较,如果没有就把该元素加入到哈希表中,如果有就找到重复数了。时间复杂度是O(n),但是消耗了一个大小为O(n)的哈希表,是典型的以空间换取时间的做法。

class Solution { public: int findRepeatNumber(vector<int>& nums) { unordered_set<int> nSet; for(int i : nums) { if(nSet.count(i) != 0) return i; // 假如hashset中已经有i了,说明重复了,返回i else nSet.insert(i); } return -1; } };

方案3:利用数组元素与数组元素下标的关系来查找。遍历整个数组,当扫描到下标为i的数字(m)时,先判断这个数字是否为i,如果是则继续遍历;如果不是则再判断下标为m的数字是否为m,如果是则找到重复数了,否则就把第i个数字与第m个数字交换位置,直到找到重复数。

class Solution{ public: int findRepeatNumber(vector<int>& nums){ int n=nums.size(); for(int i=0;i<n;i++){ while(i!=nums[i]&&nums[i]!=nums[nums[i]]) swap(nums[i],nums[nums[i]]); if(nums[i]!=i&&nums[i]==nums[nums[i]]) return nums[i] ; } return -1; } };
最新回复(0)