380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III

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. 查找重复的电子邮箱【简单题】

380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III_第1张图片

代码:

# Write your MySQL query statement below
select Email
from Person
group by Email
having count(Email) > 1;

1050. 合作过至少三次的演员和导演【简单题】

380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III_第2张图片
380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III_第3张图片
代码:

# 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【简单题】

380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III_第4张图片
380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III_第5张图片
380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III_第6张图片

代码:

# 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【简单题】

380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III_第7张图片
380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III_第8张图片
380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III_第9张图片

代码:

# 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展示

你可能感兴趣的:(力扣刷题记录,java,leetcode,刷题记录)