题意:[1,n]范围内的n+1个数,有且仅有一个数字重复,请找出这个重复的数字,解题思路有以下三种方法
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
// 方法一:改变数组值(可能与题目要求不符),取相反数,判断该数是否是重复数,非常简单的方法
class Solution {
public:
int findDuplicate(vector<int>& nums) {
for (int i = 0; i < nums.size(); ++i) {
if (nums[abs(nums[i])] < 0) return abs(nums[i]);
nums[abs(nums[i])] = (-1)* nums[abs(nums[i])];
}
return 0;
}
};
// 方法二:二进制位计数法,很是新颖的方法,可通过反正法的方式验证该思路的正确性
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int target = 0, k = 0, N = nums.size() - 1;
int testN = N;
while (testN) {
k++;
testN >>= 1;
}
for (int i = 0; i < k; i++) {
int x = 0, y = 0;
for (int j = 0; j <= N; j++) {
x += (nums[j] >> i) & 1;
if (j < N) {
y += ((j + 1) >> i) & 1;
}
}
if (x > y) {
target += 1 << i;
}
}
return target;
}
};
// 方法三:快慢指针和先后指针发(可参考leetcode答案),同前面做的确定环形链表的起始点类似