leetcode 287寻找重复数

这道题用STL容器就很好写了,可以用set也可以用map,
用unordered_map的C++代码如下:
class Solution {
public:
int findDuplicate(vector<int>& nums) {
unordered_map<int, int> m;
int res;
for(int i=;i<nums.size();i++){
if(m.count(nums[i])){
res=nums[i];break;
}
m[nums[i]]=i;
}
return res;
}
};
12ms beat 44%
使用set:
class Solution {
public:
int findDuplicate(vector<int>& nums) {
set<int> s;
int res;
for(int i=;i<nums.size();i++){
if(s.find(nums[i])!=s.end()){
res=nums[i];break;
}
s.insert(nums[i]);
}
return res;
}
};
16ms beat 33%
C++ 二分法:
但是,但是,但是,题目要求time O(n2) space O(1) 说明这道题要时间换空间,那么使用二分法:
timeO(nlog(n)) spaceO(1): 1 2 2 3 5 4对于某个数x,如果小于等于他的数出现次数大于他,说明重复数在【low,x】之间,如小于等于2的数有3个,那么重复数在【1,2】之间;小于等于1的数只有1个,那么在【2,2】之间,从而得解
class Solution {
public:
int findDuplicate(vector<int>& nums) {
//二分法
/*理论分析,所有的数出现的次数总和加起来为n+1==len,计mid=(low+high)/2;那么当小于mid出现次数大于mid时,则重复数在mid左边*/
int len=nums.size();
int low=,high=len-;
while(low<high){
int mid=low+(high-low)/,cnt=;
for(int num:nums)
if(num<=mid) cnt++;
if(cnt>mid)
high=mid;
else
low=mid+;
}
return low;
}
};
快慢指针:
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n=nums.size()-;
if(n<) return ;
int slow = nums[];
int fast = nums[nums[]];
//vector<int> fs={fast},ss={slow},ts;
while (slow != fast)
{
slow = nums[slow];
fast = nums[nums[fast]];
//fs.push_back(fast);
//ss.push_back(slow);
}
int target=;
while (target != slow){
slow=nums[slow];
target=nums[target];
//ts.push_back(target);
//ss.push_back(slow);
}
/*
cout<<"fs: ";
for(int n:fs)
cout<<n<<",";
cout<<endl;
cout<<"ss: ";
for(int n:ss)
cout<<n<<",";
cout<<endl;
cout<<"ts: ";
for(int n:ts)
cout<<n<<",";
cout<<endl;*/
return target;
}
};
leetcode 287寻找重复数的更多相关文章
- Java实现 LeetCode 287 寻找重复数
287. 寻找重复数 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 ...
- LeetCode | 287. 寻找重复数
特别感谢LeetCode大佬陈牧远的科普知识 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找 ...
- [LeetCode]287. 寻找重复数(二分)
题目 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 1: 输入: [ ...
- LeetCode:寻找重复数【287】
LeetCode:寻找重复数[287] 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数 ...
- Leetcode之二分法专题-287. 寻找重复数(Find the Duplicate Number)
Leetcode之二分法专题-287. 寻找重复数(Find the Duplicate Number) 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 ...
- 287. 寻找重复数 Java解法
287. 寻找重复数 这题的难点就在于下面的说明了,我们先不管下面的那些说明的要求,用常规的解法来解答下上的题目. 排序思想解法 先把原来的数组进行排序,然后逐个遍历,一旦发现后一个元素和当前的元素相 ...
- 【Leetcode】287. 寻找重复数(数组模拟链表的快慢指针法)
寻找重复数 根据题意,数组中的数字都在1~n之间,所以数字的范围是小于数组的范围的,数组的元素可以和数组的索引相联系. 例如:nums[0] = 1 即可以将nums[0]作为索引 通过nums[0] ...
- 【leetcode】287. 寻找重复数
题目链接:传送门 题目描述: 给定一个数组 nums 包含 n + 1 个整数,每个整数在 1 到 n 之间,包括 1 和 n.现在假设数组中存在一个重复的数字,找到该重复的数字. 注意 不能修改数组 ...
- Leetcode题目287.寻找重复数(中等)
题目描述: 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 1: 输入 ...
随机推荐
- crm---本项目的权限控制模式
一:url权限: 最底层的权限控制,,缺点在与没有预判的机制,造成客户体验下降. 前提: 为controller中的每一个方法(即资源)定义一个资源(Resource)名称,,该 ...
- Action访问Servlet的API
Action访问Servlet的API_,主要访问如下: 1.>获取request对象 2.>获取请求参数 3.>获取response对象,可用于传递cookie 3.>获取作 ...
- C#判断点是否在直线上
判断点在直线上,实际上就是判断点到直线上的垂直距离.点到直线垂直距离为0,则点在线上.当然也可以误差设置误差几个像素. 参考资料并进行修改:http://blog.sina.com.cn/s/blog ...
- php强大的filter过滤用户输入
<?php $filters = array //定义过滤的数组 ( "name" => array ( "filter"=>FILTER_S ...
- 日语能力考试N2级核心词汇必备—形容词
日语能力考试N2级核心词汇必备—形容词 ありがたい·有難い 难得的,值得感谢的,真高兴的あかい·赤い 红色的,左翼的,共产主义的あさい·浅い 浅的,事物的程度等小的,色淡的,浅薄的,肤浅的あつい· 1 ...
- 关于Pandas中Dataframe的操作(一)
1.如何实现两个dataframe去重()? 假设df1是所有的数据,现在想去除与df2中重复的数据,也就是实现对df1进行操作,让他的数据不再包括df2. 方法一:先把需要剔除的df2的某一列(如i ...
- Spring boot 拦截器和过滤器
1. 过滤器 Filter介绍 Filter可以认为是Servlet的一种“加强版”,是对Servlet的扩展(既可以对请求进行预处理,又可以对处理结果进行后续处理.使用Filter完整的一般流程是: ...
- Idea集成使用SVN教程
第一步:下载svn的客户端,通俗一点来说就是小乌龟啦!官网下载地址:https://tortoisesvn.net/downloads.html 下载之后直接安装就好了,但是要注意这里,选择安装所有的 ...
- 【洛谷P3338】力
题目大意:求 \[ E_{j}=\sum_{i<j} \frac{q_{i}}{(i-j)^{2}}-\sum_{i>j} \frac{q_{i}}{(i-j)^{2}} \] 题解:可以 ...
- java数据结构3--List
List 1.1 list接口的简介 1.2 list实现子类 ArrayList:线程不安全,查询速度快,底层用的是数组,增删慢LinkedList:线程不安全,链表结构,增删速度快,查询慢Vect ...