后面3个题都是限制在1~n的,所有可以不先排序,可以利用巧方法做。最后两个题几乎一模一样。

217. Contains Duplicate

可以通过排序然后判断相邻两个的数是否相等,时间复杂度O(nlogn),空间复杂度O(1)

class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
int length = nums.size();
if(length <= )
return false;
sort(nums.begin(),nums.end());
for(int i = ;i < length;i++){
if(nums[i] == nums[i-])
return true;
}
return false;
}
};

使用hash-map,时间复杂度时间复杂度O(n),空间复杂度O(n)

class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_map<int,int> m;
for(int i = ;i < nums.size();i++){
if(m.count(nums[i]) == )
m[nums[i]] = ;
else
return true;
}
return false;
}
};

219. Contains Duplicate II

有没有重复的两个数,且这两个数的之间的距离大于k

用hash存储数和index,如果大于了k,就以当前这个位置的index重新更新数所对应的位置索引

class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int,int> m;
for(int i = ;i < nums.size();i++){
if(m.count(nums[i]) == )
m[nums[i]] = i;
else
if(i - m[nums[i]] > k)
m[nums[i]] = i;
else
return true;
}
return false;
}
};

220. Contains Duplicate III

http://www.cnblogs.com/grandyang/p/4545261.html

要求两数的索引的绝对值小于k,数值差的绝对值小于t。

索引的绝对值小于k可以用一个滑动窗口来解决,即代码中的j是窗口的左边界,i是当前窗口右边界,一旦超过了k就移动左边界。

数值差的绝对值小于t相当于:|Ni - Nj| <= t,展开得到-t <= Ni - Nj <= t,继续变换得到Nj-t <= Ni <= Nj+t,最终得到Ni - t <= Nj <= Ni + t。

lower_bound是寻找第一个大于等于当前数的结果,也就是说找第一个满足下边界的Nj,lower_bound返回的是一个迭代器,如果能找到下边界的第一个,并且满足上边界就证明可以找到这么一个值。如果找到,但是不满足上边界,那证明当前的map中没有数可以满足上边界,因为这个数是最小的下边界数,不满足上边界则代表大于上边界,既然这个最小的都大于上边界,其他数也都大于上边界。这里的代码实际上是想实现判断是否满足上边界,只是写成了abs的形式。

map, set等数据结构是基于红黑树实现的,unordered_map和unordered_set是基于哈希表实现的,而stack和priority_queue分别是栈和堆,能用lower_bound的数据结构是map, set, 或者vector这样的容器。首先我们要知道lower_bound的实现是基于二分搜索法的,那么容器必须要有序,所以那些unordered什么的自然不能用了。

时间复杂度为nlogn,lower_bound时间复杂度为logn

class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
map<long,int> m;
int j = ;
for(int i = ;i < nums.size();i++){
if(i - j > k)
m.erase(nums[j++]);
auto it = m.lower_bound((long)nums[i] - t);
if(it != m.end() && abs(nums[i] - it->first) <= t)
return true;
m[nums[i]] = i;
}
return false;
}
};

287. Find the Duplicate Number

注意:这个mid是数字,不是下标。

假设一个没有重复的数组是[1,2,3,4]

没有重复的话,小于等于2的个数应该是2个,小于等于3的个数是3个。

对于一个有重复的数组[1,2,2,3,4]

小于等于2的个数是3,小于等于3的个数是4,也就是说超过了他本身的值了。

用二分法,找中间值,如果超过了本身的数,说明重复的数一定小于他本身;没有超过,说明重复的数一定大于他本身

class Solution {
public:
int findDuplicate(vector<int>& nums) {
int length = nums.size();
if(length <= )
return -;
int start = ;
int end = length - ;
while(start < end){
int mid = (start + end)/;
int count = ;
for(int i = ;i < length;i++){
if(nums[i] <= mid)
count++;
}
if(count > mid)
end = mid;
else
start = mid + ;
}
return start;
}
};

http://www.cnblogs.com/grandyang/p/4843654.html

https://blog.csdn.net/xudli/article/details/48802345

https://segmentfault.com/a/1190000003817671

442. Find All Duplicates in an Array

注意比的时候要i+1,因为数值比坐标大

把数放到他对应的索引下重新排数组,排完后统计那些索引不等于自己的值的结果

这个i--其实就是表明了一直在这个位置循环直到找到值和索引相同的

class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> result;
int length = nums.size();
if(length <= )
return result;
for(int i = ;i < length;i++){
if(nums[i] != nums[nums[i] - ]){
swap(nums[i],nums[nums[i]-]);
i--;
}
}
for(int i = ;i < length;i++){
if(nums[i] != i + )
result.push_back(nums[i]);
}
return result;
}
};

http://www.cnblogs.com/grandyang/p/6209746.html

448. Find All Numbers Disappeared in an Array

这个题与442的题代码几乎一模一样,只是result存储的是坐标+1,也就是具体的消失的数值

class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> result;
int length = nums.size();
for(int i = ;i < length;i++){
if(nums[i] != nums[nums[i]-]){
swap(nums[i],nums[nums[i]-]);
i--;
}
}
for(int i = ;i < length;i++){
if(nums[i] != i+)
result.push_back(i+);
}
return result;
}
};

https://www.cnblogs.com/grandyang/p/6222149.html

leetcode 217. Contains Duplicate 287. Find the Duplicate Number 442. Find All Duplicates in an Array 448. Find All Numbers Disappeared in an Array的更多相关文章

  1. LeetCode 448. Find All Numbers Disappeared in an Array (在数组中找到没有出现的数字)

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  2. leetcode 448. Find All Numbers Disappeared in an Array -easy (重要)

    题目链接: https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/description/ 题目描述: Give ...

  3. 【LeetCode】448. Find All Numbers Disappeared in an Array 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 方法一:暴力求解 方法二:原地变负做标记 方法三:使用set ...

  4. LeetCode "448. Find All Numbers Disappeared in an Array"

    My first reaction is to have an unlimited length of bit-array, to mark existence. But if no extra me ...

  5. 5. Leetcode 448. Find All Numbers Disappeared in an Array

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  6. LeetCode 448 Find All Numbers Disappeared in an Array 解题报告

    题目要求 Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice a ...

  7. 【leetcode】448. Find All Numbers Disappeared in an Array

    problem 448. Find All Numbers Disappeared in an Array solution: class Solution { public: vector<i ...

  8. [LeetCode&Python] Problem 448. Find All Numbers Disappeared in an Array

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  9. LeetCode: 448 Find All Numbers Disappeared in an Array(easy)

    题目: Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice an ...

随机推荐

  1. 重温jQuery

    Write Less, Do More! ——John Resig(jQuery设计者) 目录 基础知识 概况 编程访问DOM节点 基础知识 Web网页是有结构的HTML文档.浏览器分析HTML文档, ...

  2. C Traps:运算

    位移 如果sizeof(int) = 4,那么下面的代码的结果是什么? int x=255; printf("%d", x>>34); 实际输出:63 在编译这个代码时 ...

  3. php5.5过渡--mysql连接

    以前: // $conn=mysql_connect("localhost","root","");// $db=mysql_select_ ...

  4. PHP中的prepare准备语句的意义

    mysqli和PDO扩展都有prepare这个语法,刚开始以为只是单纯的语法,没想到,还是有实际意义的: “每次发送查询语句给MySQL服务时,都必须解析该查询的语法,确保结构正确并能够执行.这是这个 ...

  5. 在Eclipse中指定JDK

    1.Windows下的Eclipse中的eclipse.ini -startup plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540 ...

  6. 软工读书笔记 week 9 ——《构建之法》

    软工读书笔记  week 9                 ——<构建之法> 最近的三周我们正式开始我们的项目.然后我也把<构建之法>中的相关章节再拿出来读了一番.以下是一些 ...

  7. PHP匹配当前传入是何种类型

    本文出至:新太潮流网络博客 /** * [is_string_regular_type 正则自动验证传入数据] * @E-mial wuliqiang_aa@163.com * @TIME 2017- ...

  8. 【Kettle】4、SQL SERVER到SQL SERVER数据转换抽取实例

    1.系统版本信息 System:Windows旗舰版 Service Pack1 Kettle版本:6.1.0.1-196 JDK版本:1.8.0_72 2.连接数据库 本次实例连接数据库时使用全局变 ...

  9. 几个很好用SQL语法(SqlServer)

    1,MERGE INTO 语句: 这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE,作用还是很强大的(简单的说就是它可以批量更新和插入处理一个数据集,如果存在就更新 ...

  10. 读取Execl表数据 导入数据库

    不知不觉博客园园林都两年多了,我是今年毕业的应届生,最近公司项目需要改动,很多的数据需要导入,很多的实体类需要些.考虑到这些问题自己写了两个winform版的小工具,一个是读取Execl数据导入数据库 ...