2022-10-27:设计一个数据结构,有效地找到给定子数组的 多数元素 。
子数组的 多数元素 是在子数组中出现 threshold 次数或次数以上的元素。
实现 MajorityChecker 类:
MajorityChecker(int[] arr)
会用给定的数组 arr 对 MajorityChecker 初始化。
int query(int left, int right, int threshold)
返回子数组中的元素 arr[left…right] 至少出现 threshold 次数,
如果不存在这样的元素则返回 -1。

答案2022-10-27:

线段树。
力扣1157,rust测试见图。

代码用rust编写。代码如下:

use std::iter::repeat;
struct MajorityChecker {
st: SegmentTree,
cq: CountQuicker,
} struct SegmentTree {
n: i32,
candidate: Vec<i32>,
hp: Vec<i32>,
} impl SegmentTree {
pub fn new(arr: &mut Vec<i32>) -> Self {
let n = arr.len() as i32;
let candidate: Vec<i32> = repeat(0).take(((n + 1) << 2) as usize).collect();
let hp: Vec<i32> = repeat(0).take(((n + 1) << 2) as usize).collect();
let mut ans = SegmentTree { n, candidate, hp };
ans.build(arr, 1, n, 1);
return ans;
} fn build(&mut self, arr: &mut Vec<i32>, l: i32, r: i32, rt: i32) {
if l == r {
self.candidate[rt as usize] = arr[(l - 1) as usize];
self.hp[rt as usize] = 1;
} else {
let m = (l + r) >> 1;
self.build(arr, l, m, rt << 1);
self.build(arr, m + 1, r, rt << 1 | 1);
let lc = self.candidate[(rt << 1) as usize];
let rc = self.candidate[(rt << 1 | 1) as usize];
let lh = self.hp[(rt << 1) as usize];
let rh = self.hp[(rt << 1 | 1) as usize];
if lc == rc {
self.candidate[rt as usize] = lc;
self.hp[rt as usize] = lh + rh;
} else {
self.candidate[rt as usize] = if lh >= rh { lc } else { rc };
self.hp[rt as usize] = i32::abs(lh - rh);
}
}
} pub fn query(&mut self, left: i32, right: i32) -> i32 {
return self.query0(left + 1, right + 1, 1, self.n, 1)[0];
} fn query0(&mut self, ll: i32, rr: i32, l: i32, r: i32, rt: i32) -> Vec<i32> {
if ll <= l && r <= rr {
return vec![self.candidate[rt as usize], self.hp[rt as usize]];
}
let m = (l + r) >> 1;
if rr <= m {
return self.query0(ll, rr, l, m, rt << 1);
} else if ll > m {
return self.query0(ll, rr, m + 1, r, rt << 1 | 1);
} else {
let mut ansl = self.query0(ll, rr, l, m, rt << 1);
let mut ansr = self.query0(ll, rr, m + 1, r, rt << 1 | 1);
if ansl[0] == ansr[0] {
ansl[1] += ansr[1];
return ansl;
} else {
if ansl[1] >= ansr[1] {
ansl[1] -= ansr[1];
return ansl;
} else {
ansr[1] -= ansl[1];
return ansr;
}
}
}
}
}
struct CountQuicker {
cnt: Vec<Vec<i32>>,
} impl CountQuicker {
pub fn new(arr: &mut Vec<i32>) -> Self {
let mut cnt: Vec<Vec<i32>> = vec![];
let max = *arr.iter().max().unwrap_or(&0);
for _i in 0..=max {
cnt.push(vec![]);
}
for i in 0..arr.len() as i32 {
cnt[arr[i as usize] as usize].push(i);
}
return Self { cnt };
} pub fn real_times(&mut self, left: i32, right: i32, num: i32) -> i32 {
self.size(num, right) - self.size(num, left - 1)
} fn size(&mut self, indies_index: i32, index: i32) -> i32 {
let mut l = 0;
let mut r = self.cnt[indies_index as usize].len() as i32 - 1;
let mut m: i32;
let mut ans = -1;
while l <= r {
m = (l + r) / 2;
if self.cnt[indies_index as usize][m as usize] <= index {
ans = m;
l = m + 1;
} else {
r = m - 1;
}
}
return ans + 1;
}
} impl MajorityChecker {
fn new(arr: Vec<i32>) -> Self {
let mut arr = arr;
let st = SegmentTree::new(&mut arr);
let cq = CountQuicker::new(&mut arr);
Self { st, cq }
} fn query(&mut self, left: i32, right: i32, threshold: i32) -> i32 {
let candidate = self.st.query(left, right);
return if self.cq.real_times(left, right, candidate) >= threshold {
candidate
} else {
-1
};
}
} fn main() {
let arr = vec![1, 1, 2, 2, 1, 1];
let mut majority_checker = MajorityChecker::new(arr);
let ans = majority_checker.query(0, 5, 4); // 返回 1
println!("ans = {:?}", ans);
let ans = majority_checker.query(0, 3, 3); // 返回 -1
println!("ans = {:?}", ans);
let ans = majority_checker.query(2, 3, 2); // 返回 2
println!("ans = {:?}", ans);
}

执行结果如下:


左神java代码

2022-10-27:设计一个数据结构,有效地找到给定子数组的 多数元素 。 子数组的 多数元素 是在子数组中出现 threshold 次数或次数以上的元素。 实现 MajorityChecker 类的更多相关文章

  1. 10.23 开课一个月零十九天 (PHP数组)

    <?php $s = "he8llo5wor6ld"; $s = preg_replace("/\d/","#",$s); //按照正 ...

  2. 2017.12.10 Java写一个杨辉三角(二维数组的应用)

    杨辉三角的定律 第n行m列元素通项公式为: C(n-1,m-1)=(n-1)!/[(m-1)!(n-m)!] 需要用到创建二维数组 package com.glut.demo; /** * 杨辉三角 ...

  3. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。

    // 第一种方法 // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...

  4. 如何设计一个LRU Cache

    如何设计一个LRU Cache? Google和百度的面试题都出现了设计一个Cache的题目,什么是Cache,如何设计简单的Cache,通过搜集资料,本文给出个总结. 通常的问题描述可以是这样: Q ...

  5. 设计一个简单的devops系统

    前言 公司设计的RDMS挺好用的,我也照猫画虎简单的设计一个DevOps系统,与大家分享,不足之处欢迎拍砖,以免误人子弟 前置条件 gitlab gitlab-runner k8s 1. gitlab ...

  6. 背水一战 Windows 10 (27) - 控件(文本类): TextBlock

    [源码下载] 背水一战 Windows 10 (27) - 控件(文本类): TextBlock 作者:webabcd 介绍背水一战 Windows 10 之 控件(文本类) TextBlock 示例 ...

  7. 笔试题&amp;面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素

    设计一个复杂度为n的算法找到单向链表倒数第m个元素.最后一个元素假定是倒数第0个. 提示:双指针查找 相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素 ...

  8. 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈

    刚入手了一本<程序员代码面试指南>,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象. 题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈, ...

  9. python小练习,打出1-100之间的所有偶数,设计一个函数,在桌面上创建10个文件,并以数字命名,复利计算函数

    练习一:打出1-100之间的所有偶数 def even_print(): for i in range(1,101): if i % 2 == 0: print (i) even_print() #列 ...

  10. 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...

随机推荐

  1. mysql替换空格制表符换行

    update ztbdb_pro set pro=REPLACE(pro,CHAR(10),''); update ztbdb_pro set pro=REPLACE(pro,CHAR(13),'') ...

  2. 联邦学习开源框架FATE架构

    作者:京东科技 葛星宇 1.前言 本文除特殊说明外,所指的都是fate 1.9版本. fate资料存在着多处版本功能与发布的文档不匹配的情况,各个模块都有独立的文档,功能又有关联,坑比较多,首先要理清 ...

  3. 孙勇男:实时视频 SDK 黑盒测试架构丨Dev for Dev 专栏

    Dev for Dev 专栏全称为 Developer for Developer,该专栏是声网与 RTC 开发者社区共同发起的开发者互动创新实践活动.透过工程师视角的技术分享.交流碰撞.项目共建等多 ...

  4. 分析document文档中script标签获取抖音无水印视频

    思路分析 使用 playwright 模拟浏览器打开分享链接 获取 播放页面 html 信息 解析 播放页面的 video标签,video标签的src属性就是视频的地址 这种模式会触发抖音的风控机制 ...

  5. 微信-JSSDK网页调用-(微信扫一扫)

    网页调用微信扫一扫接口 1.准备工作:  1.1微信浏览器 1.2微信APPID,nonceStr 2.使用方式快速预览 调用扫一扫微信接口. 1需要获取access_token 2获取 $jsapi ...

  6. 如何单机部署多个 MySQL 8.0 实例 ?

    在服务器资源有限的情况下,可利用该方案快速搭建各类 mysql 架构方案.各 MySQL 实例共享一个 mysqld 主程序,但各实例数据目录是独立的,存放在不同的文件夹中:好了.废话不多说,直接上干 ...

  7. JS一切皆对象理解

    对象都是通过函数创建的 function Fn() { this.name = '王福朋'; this.year = 1988; } var fn1 = new Fn(); fn1是个对象,它是由函数 ...

  8. Ubuntu+uWSGI部署基于Django的API【鸿篇巨制,事无巨细】

    背景 任务: 视频翻译项目需要在两个服务器上进行通信(国内&海外的阿里服务器). 因为python是主语言,选用了Django 来快速部署API. 注:Django中文文档:https://d ...

  9. AIGC时代:未来已来

    摘要:人工智能的快速发展使得我们进入了AIGC时代.AIGC时代的到来,将会带来巨大的机遇和挑战. 本文分享自华为云社区<GPT-4发布,AIGC时代的多模态还能走多远?系列之一: AIGC时代 ...

  10. Excel的读取保存案例

    python进行excel处理 1. Excel读取 # 首先导入pandas工具包 import pandas as pd # 读取Excel df = pd.read_excel('./excel ...