l两周以来,第一次睡了个爽,开心!

=================================

leetcode380 https://leetcode.com/problems/insert-delete-getrandom-o1/?tab=Description

leetcode381 https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed/

leetcode532 https://leetcode.com/problems/k-diff-pairs-in-an-array/?tab=Description

====================================================================

380讲的是
设计一个数据结构,要求可以在O(1)的时间内完成以下操作
1,插入一个数字(如果不存在的话)
2,删除一个数字(如果存在的话)
3,随机返回一个数字(要求已存在的数字被返回的概率均等)

我的思路
一开始其实是一脸懵逼的,后来看了讨论版才明白。。
如果只有前两个要求,就是普通的hash表,连冲突处理都不需要,加上第三个要求后,要求把数据映射在0——n-1上,那就双向hash好了。。。
用a数组来存储数据,无序的
用unordered_map v来存贮数据在a中的下标,可以实现O(1)的数据定位。
插入简单,删除的时候永远删掉“a中最后的数据”,如果目标数据不是最后的,只需要把它换到最后就好,注意map中存的下标值也随之改变了

 class RandomizedSet {
public:
vector<int> a;
unordered_map<int,int> v;
int n; /** Initialize your data structure here. */
RandomizedSet() {
a.clear();
v.clear();
srand(time(NULL));
n=;
} /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
bool insert(int val) {
if(v.find(val)!=v.end())return false;
a.push_back(val);
v[val]=n++;
return true;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
bool remove(int val) {
if(v.find(val)==v.end())return false;
unordered_map<int,int>::iterator it=v.find(val);
int ptr=it->second;
if(ptr!=n-){
v[a[n-]]=ptr;
a[ptr]=a[n-];
}
v.erase(it);
a.resize(--n);
return true;
} /** Get a random element from the set. */
int getRandom() {
int ptr=rand()%n;
return a[ptr];
}
}; /**
* Your RandomizedSet object will be instantiated and called as such:
* RandomizedSet obj = new RandomizedSet();
* bool param_1 = obj.insert(val);
* bool param_2 = obj.remove(val);
* int param_3 = obj.getRandom();
*/

380

====================================================================

381讲的是
设计一个允许重复数据的数据结构,要求可以在O(1)的时间内完成以下操作
1,插入一个数字(如果存在的话返回false)
2,删除一个数字(如果存在的话返回true)
3,随机返回一个数字(要求已存在的数字被返回的概率均等)

我的思路
一开始感觉直接直接把380的代码改成multimap就行,结果交了一发发现行不通,a中最后一个数据不知道对应在map中的哪儿(因为可能有多个)
多个数据的话我们在map中使用vector来存储就可以,为了O(1)定位,我们在a中使用pair来存储val和map第二维的下标
思考后发现a.back()代表的val一定是相同值最后一次出现的,所以我们只要交换m.find(val).back()和m[a.back().val][a.back().index]就行

 class RandomizedCollection {
public:
/** Initialize your data structure here. */
RandomizedCollection() { } /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
bool insert(int val) {
auto result = m.find(val) == m.end(); m[val].push_back(nums.size());
nums.push_back(pair<int, int>(val, m[val].size() - )); return result;
} /** Removes a value from the collection. Returns true if the collection contained the specified element. */
bool remove(int val) {
auto result = m.find(val) != m.end();
if(result)
{
auto last = nums.back();
m[last.first][last.second] = m[val].back();
nums[m[val].back()] = last;
m[val].pop_back();
if(m[val].empty()) m.erase(val);
nums.pop_back();
}
return result;
} /** Get a random element from the collection. */
int getRandom() {
return nums[rand() % nums.size()].first;
}
private:
vector<pair<int, int>> nums;
unordered_map<int, vector<int>> m;
};

code from the other people

 class RandomizedCollection {
private:
vector<pair<int,int>> a;
unordered_map<int,vector<int> > m;
int n; public:
/** Initialize your data structure here. */
RandomizedCollection() {
a.clear();
m.clear();
srand(time(NULL));
} /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
bool insert(int val) {
bool result=(m.find(val)==m.end());
m[val].push_back(a.size());
a.push_back(pair<int,int>(val,m[val].size()-));
return result;
} /** Removes a value from the collection. Returns true if the collection contained the specified element. */
bool remove(int val) {
bool result=(m.find(val)!=m.end());
if(result){
pair<int,int> last=a.back();
if(a.back().first!=val){
m[last.first][last.second]=m[val].back();
a[m[val].back()]=a.back();
}
a.pop_back();
m[val].pop_back();
if(m[val].empty())m.erase(val);
}
return result;
} /** Get a random element from the collection. */
int getRandom() {
if(!a.size())return -;
int ptr=rand()%a.size();
return a[ptr].first;
}
}; /**
* Your RandomizedCollection object will be instantiated and called as such:
* RandomizedCollection obj = new RandomizedCollection();
* bool param_1 = obj.insert(val);
* bool param_2 = obj.remove(val);
* int param_3 = obj.getRandom();
*/

My Code

RE一万年,发现是忽略了“remove时如果m[val]已经被删空,应该erase掉”这种情况

还是挺有趣的一道题目。

====================================================================

532讲的是
输入n个数字a[i](无序,-1e7<=a[i]<=1e7,n<=1e4)和一个数字k,问你其中有多少不同的数对。
数对的定义:(i,j)是数对当且仅当abs(i-j)==k

我的思路
暴力的话就是排序去重,然后一个个压到hash中判断加减k是否有数据。O(nlogn)
后来想了想,感觉O{n}也可以,永远用后进入的数字来匹配之前的,就可以保证不重复。(如果有重复的数字要进入,就跳过)。
然后发现k居然可以等于0,丧心病狂,分开处理好了。。。

 class Solution {
public:
int findPairs(vector<int>& nums, int k) {
int ans=;
int n=nums.size();
if(n<)return ;
unordered_map<int,int> m;
if(k){
if(k<)return ;
for(int i=;i<n;i++){
int temp=nums[i],aim;
if(m.find(temp)!=m.end())continue;
aim=temp+k;
if(m.find(aim)!=m.end())ans++;
aim=temp-k;
if(m.find(aim)!=m.end())ans++;
m[temp]=;
}
}else{
for(int i=;i<n;i++){
int temp=nums[i];
if(m.find(temp)!=m.end()){
if(m[temp]==){
ans++;
m[temp]++;
}
}else{
m[temp]=;
}
}
}
return ans;
}
};

532

又是一道可以用python一行解决的题目(害怕)

 def findPairs(self, nums, k):
return len(set(nums)&{n+k for n in nums}) if k>0 else sum(v>1 for v in collections.Counter(nums).values()) if k==0 else 0

展开是这样的

 def findPairs(self, nums, k):
if k>0:
return len(set(nums)&set(n+k for n in nums))
elif k==0:
return sum(v>1 for v in collections.Counter(nums).values())
else:
return 0

2017-3-8 leetcode 380 381 532的更多相关文章

  1. 2017/11/22 Leetcode 日记

    2017/11/22 Leetcode 日记 136. Single Number Given an array of integers, every element appears twice ex ...

  2. 2017/11/21 Leetcode 日记

    2017/11/21 Leetcode 日记 496. Next Greater Element I You are given two arrays (without duplicates) num ...

  3. 2017/11/13 Leetcode 日记

    2017/11/13 Leetcode 日记 463. Island Perimeter You are given a map in form of a two-dimensional intege ...

  4. 2017/11/20 Leetcode 日记

    2017/11/14 Leetcode 日记 442. Find All Duplicates in an Array Given an array of integers, 1 ≤ a[i] ≤ n ...

  5. 2017/11/9 Leetcode 日记

    2017/11/9 Leetcode 日记 566. Reshape the Matrix In MATLAB, there is a very useful function called 'res ...

  6. 2017/11/7 Leetcode 日记

    2017/11/7 Leetcode 日记 669. Trim a Binary Search Tree Given a binary search tree and the lowest and h ...

  7. 2017/11/6 Leetcode 日记

    2017/11/6 Leetcode 日记 344. Reverse String Write a function that takes a string as input and returns ...

  8. 2017/11/5 Leetcode 日记

    2017/11/5 Leetcode 日记 476. Number Complement Given a positive integer, output its complement number. ...

  9. 2017/11/3 Leetcode 日记

    2017/11/3 Leetcode 日记 654. Maximum Binary Tree Given an integer array with no duplicates. A maximum ...

随机推荐

  1. 分布式文件管理系统MooseFS在centOS 7中的安装

    首先,MooseFS是做什么的在这边不做具体详述,这边主要记录一下我在自己部署MooseFS中遇到的问题和步骤(大部分参考的其他博客或者资料) 首先是准备资源,MooseFS的最新安装包可以去官网下载 ...

  2. ie8及其以下版本兼容性问题之圆角

    解决办法:在http://css3pie.com/页面下载一个PIE.htc的文件,加载到根目录下,然后在css中加上一句behavior:url(../js/PIE.htc);如下: .border ...

  3. EMC VNX5200/5400存储 新增LUN与Hosts映射操作

    EMC VNX5200/5400 1.创建RAID  Groups 1.1        进入EMC VNX5200/5400主界面,依次选择Storage——Storage Pools——RAID ...

  4. Android 性能测试初探(一)

    Android 性能测试,跟 pc 性能测试一样分为客户端及服务器,但在客户端上的性能测试分为 2 类: 一类为 rom 版本的性能测试 一类为应用的性能测试 对于应用性能测试,包括很多测试项,如启动 ...

  5. JQuery的click,trigger触发a标签的click事件无效的问题分析

    今天在做一个手机端webAPP链接下载的时候,给a标签一个下载链接,但是通过 <a id="downFile" download="" href=&quo ...

  6. 【Shell编程】Shell基本语法

    Shell 语法   Shell程序设计作为一种脚本语言,在Linux系统中有广泛的应用,本文记录了关于Shell程序设计的基础语法知识和常用命令,方便查询,熟练使用shell也需要经常实践,这对于完 ...

  7. C#第十一节课

    类 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Thr ...

  8. qbxt 考前集训 Day1

    立方数(cubic) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...

  9. 国庆day2

    a[问题描述]你是能看到第一题的 friends呢.—— hja世界上没有什么比卖的这 贵弹丸三还令人绝望事了,所以便么一道题.定义

  10. Linux思维导图之查找命令

    常用查找命令的区别: