380. O(1) 时间插入、删除和获取随机元素【中等题】【每日一题】
思路:
通过hashmap来确定插入和删除元素时是否集合中已经存在重复元素。
通过int数组存放集合元素来实现对元素的随机获取(通过随机获取元素对应的下标来随机获取元素)。
代码:
class RandomizedSet {
static int[] nums;//存放元素,通过元素的有序存储来实现根据下标随机取出
Random random;//随机对象
Map<Integer,Integer> map;//通过hashmap来保证元素的唯一性
int index;//数组下标
public RandomizedSet() {//构造函数初始化参数
this.nums = new int[200000];
this.random = new Random();
this.map = new HashMap<>();
this.index = -1;
}
public boolean insert(int val) {
if(map.containsKey(val)){//如果map中存在当前元素,则插入失败,返回false
return false;
}else{
map.put(val,++index);//将当前元素存入map,值为index先自增1代表在nums中的下标
nums[index] = val;//在nums数组对应index位置存入当前元素
return true;//插入成功,返回true
}
}
public boolean remove(int val) {
if(!map.containsKey(val)){//如果map中不存在当前元素,则删除失败,返回false
return false;
}else{
int cur = map.remove(val);//删除当前元素并将当前元素对应的nums下标取出
if(cur != index){//如果当前元素下标不是nums数组最后一个有效下标
//说明删除的元素在nums数组有效右边界左侧,因此需要将map中对应nums有效右边界位置的元素对应的数组下标更新为刚刚删除的下标位置
map.put(nums[index],cur);
}
//如果当前元素下标是nums数组最后一个有效下标,则不用上一步操作
nums[cur] = nums[index--];//将nums有效右边界元素更新到cur位置,并将index自减1表示nums数组有效右边界左移1位
return true;//删除成功,返回true
}
}
public int getRandom() {
return nums[random.nextInt(index+1)];//返回[0,index]返回内的int类型随机数对应的nums下标位置的元素
}
}
/**
* Your RandomizedSet object will be instantiated and called as such:
* RandomizedSet obj = new RandomizedSet();
* boolean param_1 = obj.insert(val);
* boolean param_2 = obj.remove(val);
* int param_3 = obj.getRandom();
*/
182. 查找重复的电子邮箱【简单题】
代码:
# Write your MySQL query statement below
select Email
from Person
group by Email
having count(Email) > 1;
1050. 合作过至少三次的演员和导演【简单题】
代码:
# Write your MySQL query statement below
select actor_id,director_id
from ActorDirector
group by actor_id,director_id
having count(`timestamp`) >= 3;
1587. 银行账户概要 II【简单题】
代码:
# Write your MySQL query statement below
select u.name as `NAME`,sum(t.amount) as `BALANCE`
from Transactions t left join Users u
on t.account = u.account
group by t.account
having BALANCE > 10000;
1084. 销售分析III【简单题】
代码:
# Write your MySQL query statement below
select s.product_id,product_name # ,s.sale_date
from Product p left join Sales s
on p.product_id = s.product_id
group by s.product_id
having min(sale_date) >= '2019-01-01' and max(sale_date) <= '2019-03-31' # 先筛选,再select展示