当前位置:网站首页>287. 寻找重复数
287. 寻找重复数
2022-07-06 10:24:00 【ღCauchyོꦿ࿐】
题意
解一
- 二分答案
简单解释,官解也很详细。
定义: d p [ i ] {dp[i]} dp[i] 表示 n u m s [ i ] nums[i] nums[i] 中 < = i <=i <=i 的数的个数。
看这样一个序列:
nums:3 1 3 4 2
dp: 1 2 4 5
性质:自重复的数起,之后所有 d p [ i ] dp[i] dp[i] 都 > i >i >i ,之前都 < = i <=i <=i。
在看这样一个序列:
nums:3 1 3 4 3
dp: 1 1 4 5
尽管重复了多次,但是还是满足上面的性质。
那么我们二分答案,统计 < = m i d <=mid <=mid 的数的个数,如果个数 > m i d >mid >mid ,说明是在右侧,可能是答案, r = m i d r=mid r=mid,否则 l = m i d + 1 l=mid+1 l=mid+1。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n = nums.size();
int l = 1, r = n;
while(l < r) {
int mid = (l + r) >> 1;
auto f = [=](int x){
int res = 0;
for (int i = 0; i < n; i++)
if(nums[i] <= x) res += 1;
return res <= x;
};
if(f(mid)) l = mid + 1;
else r = mid;
}
return r;
}
};
/* 一旦加上了重复的数,那么之后一定更大 // 二分check,更小就不要,说明在答案左,l向右调整。 nums: 1 3 2 4 2 [1234]: 1 3 4 5 mid: 3 -> res = 4, r = 3 mid: 2 -> res = 3, r = 2 mid: 1 -> res = 1, l = 2 l == r = 2 nums: 1 3 2 3 4 3 [1234]: 1 2 5 6 mid: 3 -> res = 5, r = 3 mid: 2 -> res = 2, l = 3 l == r = 3 */
解二
二进制
重复一次:
- 重复的数为 x x x, [ 1 , n ] [1,n] [1,n] 都各出现一次,外加 x x x 多出现一次。
- 统计二进制下 1 1 1 的个数,原序列相比 [ 1 , n ] [1,n] [1,n] 序列,多出的 1 1 1 都是由 x x x 产生。
重复多次:
重复的数为 x x x, x x x 代替 [ 1 , n ] [1,n] [1,n] 中没出现的数 y y y,外加 x x x 多出现一次。
四种情况:00、01、10、11(以下x,y表示某一位为1或0)
- x = 0 , y = 0 x=0,y=0 x=0,y=0:<=
- x = 0 , y = 1 x=0,y=1 x=0,y=1:<=
- x = 1 , y = 0 x=1,y=0 x=1,y=0:>
- x = 1 , y = 1 x=1,y=1 x=1,y=1:>
所以,对于 > > > 的情况,将该位 1 1 1 加上即可。
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n = nums.size();
int res = 0;
for (int i = 0; i < 31; i++) {
int x = 0, y = 0;
for (int j = 0; j < n; j++) {
if(nums[j] & (1 << i)) x += 1;
}
for (int j = 1; j < n; j++) {
if(j & (1 << i)) y += 1;
}
if(x > y) res |= (1 << i);
}
return res;
}
};
解三
- 快慢指针
n + 1 n + 1 n+1个数, [ 1 , n ] [1,n] [1,n] 范围内。每个位置 i i i 连边 i − i- i−> n u m s [ i ] nums[i] nums[i]。
3 1 3 4 2
0 1 2 3 4建边:0->3, 1->1, 2->3, 3->4, 4->2
明显重复的 3 3 3 是环的入口。
又点 0 0 0 只可能有出边,不可能自环。所以定义快慢指针 l , r l,r l,r 都从 0 0 0 开始。
然后就是环形链表找入口的常规解法:
- 慢一步、快二步
- 慢置为 0 0 0
- 慢一步、快一步
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int l = 0, r = 0;
do {
l = nums[l];
r = nums[nums[r]];
} while(l != r);
l = 0;
while(l != r) {
l = nums[l];
r = nums[r];
}
return l;
}
};
边栏推荐
- TCP packet sticking problem
- 容器里用systemctl运行服务报错:Failed to get D-Bus connection: Operation not permitted(解决方法)
- C language exchanges two numbers through pointers
- Top command details
- High precision operation
- 测试123
- 從交互模型中蒸餾知識!中科大&美團提出VIRT,兼具雙塔模型的效率和交互模型的性能,在文本匹配上實現性能和效率的平衡!...
- Today in history: the mother of Google was born; Two Turing Award pioneers born on the same day
- Automatic reservation of air tickets in C language
- Jielizhi obtains the customized background information corresponding to the specified dial [chapter]
猜你喜欢
Jerry's access to additional information on the dial [article]
虚拟机VirtualBox和Vagrant安装
[Android] kotlin code writing standardization document
Why does wechat use SQLite to save chat records?
Today in history: the mother of Google was born; Two Turing Award pioneers born on the same day
递归的方式
Recursive way
Comparative examples of C language pointers *p++, * (p++), * ++p, * (++p), (*p) + +, +(*p)
Jerry's updated equipment resource document [chapter]
Four processes of program operation
随机推荐
The integrated real-time HTAP database stonedb, how to replace MySQL and achieve nearly a hundredfold performance improvement
阿里云国际版ECS云服务器无法登录宝塔面板控制台
2022 Summer Project Training (I)
2019 Alibaba cluster dataset Usage Summary
30 minutes to understand PCA principal component analysis
declval(指导函数返回值范例)
Coco2017 dataset usage (brief introduction)
带你穿越古罗马,元宇宙巴士来啦 #Invisible Cities
第三季百度网盘AI大赛盛夏来袭,寻找热爱AI的你!
SQL优化问题的简述
從交互模型中蒸餾知識!中科大&美團提出VIRT,兼具雙塔模型的效率和交互模型的性能,在文本匹配上實現性能和效率的平衡!...
Declval (example of return value of guidance function)
win10系统下插入U盘有声音提示却不显示盘符
Codeforces Round #803 (Div. 2)
C语言指针*p++、*(p++)、*++p、*(++p)、(*p)++、++(*p)对比实例
Running the service with systemctl in the container reports an error: failed to get D-Bus connection: operation not permitted (solution)
Cobra 快速入门 - 专为命令行程序而生
2022暑期项目实训(二)
MSF横向之MSF端口转发+路由表+SOCKS5+proxychains
模板于泛型编程之declval