题目
思路
hash
遍历,辅助数组统计数字出现的次数,出现次数大于1即返回
置换
因为题目已知长度为n的数组,包含的数字为1~n-1,如果没有重复元素,那么索引与元素值可以一一对应。
循环遍历,如果当前索引值不等于元素值那么将当前元素值与当前元素值对应的索引位置的元素进行交换,如果遇到当前元素值与其所对应的索引位置元素值相同,则退出
优点:无辅助数组
代码
// 解法一 hash
int findRepeatNumber(vector<int>& nums) {
int hash[100100]= {0};
for(int i=0; i<nums.size(); i++)
if(++h[nums[i]]>1)return nums[i];
return -1;
}
// 解法二 最优解法 没有额外占用存储空间
int findRepeatNumber(vector<int>& nums) {
for(int i=0; i<nums.size(); i++){
while(i!=nums[i]){
//退出条件-当找到一个索引号不等于当前值,并且当前值对应索引位置等于当前值
if(nums[i]==nums[nums[i]]) return nums[i];
//如果当前索引号和值不相同,将值交换到值对应的索引位置
// swap(nums[i],nums[nums[i]]);
int temp = nums[i];
nums[i]=nums[nums[i]];
nums[temp]=temp;
}
}
return -1;
}