后面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. javaMail 邮件发送和接收示例,支持正文图片、html、附件(转)

    转自:https://blog.csdn.net/star_fly4/article/details/52037587 一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文 ...

  2. ubuntu中获取文件名称并生成txt文件

    简介: 在机器视觉学习过程中,通常会经常批量处理一些图片,在Ubuntu下可以使用find命令,来实现将文件名全部读取出来,生成列表txt文件,作为标签使用 (1)find命令格式如下: find / ...

  3. 2018-10-15 00:41:45 c language

    2018-10-15 00:41:45  c language C语言输入法的选择 全角和半角的区别主要在于除汉字以外的其它字符,比如标点符号.英文字母.阿拉伯数字等,全角字符和半角字符所占用的位置的 ...

  4. C语言中的逗号表达式

    转载:http://www.cnblogs.com/hnrainll/archive/2011/08/03/2126660.html C语言提供一种特殊的运算符——逗号运算符.用它将两个表达式连接起来 ...

  5. HBase 负载均衡

    HBase 可以根据当前集群的负载以region为单位进行rebalance.在HMaster中,后台会起一个线程定期检查是否需要进行rebalance,线程叫做BalancerChore.线程每隔  ...

  6. C# 标准的MD5加密32位

    标准的MD5加密32位小写的: public static string GetMD5(string myString) { MD5 md5 = new MD5CryptoServiceProvide ...

  7. sql建JOB语句

    declare job_id pls_integer; begin sys.dbms_job.submit(job => job_id, what => 'proc_AGTAWBSTATI ...

  8. 如何在 OS X 中安装 ruby

    如何在 OS X 中安装 ruby 软件包下载 链接: http://pan.baidu.com/s/1mgMil5I 密码: tiqg 安装 http://brew.sh/ 1. 先安装 brew( ...

  9. openoffice centos7.4 安装

    其他是配置好java环境后操作 1.下载软件 http://www.openoffice.org/download/other.html 2.安装 tar xf Apache_OpenOffice_4 ...

  10. ZT 查找字符串中连续最长的数字串

    查找字符串中连续最长的数字串 有俩方法,1)比较好理解一些.2)晦涩 1) /* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回, 并把这个最长数字串付给其中一个函数参数outputstr ...