面试 - 查找数组中的幅度极点

2024-04-18

幅度极点:数组中左侧元素小于或等于它且右侧元素大于或等于它的元素。

输入示例

3,1,4,5,9,7,6,11

期望的输出

4,5,11

我在面试中被问到这个问题,我必须返回元素的索引,并且只返回第一个满足条件的元素。

My logic

  1. 取两个 MultiSet(这样我们也可以考虑重复),一个用于元素的右侧,一个用于元素的左侧 元素(极)。
  2. 从第 0 个元素开始,并将其余所有元素放入“正确的集合”中。
  3. 基本条件如果第 0 个元素小于或等于“右集”上的所有元素,则返回其索引。
  4. 否则将其放入“左集”并从索引 1 处的元素开始。
  5. 遍历数组,每次从“左组”中选取最大值,从“右组”中选取最小值并进行比较。
  6. 在任何时刻,对于任何元素,其左侧的所有值都在“左集”中,其右侧的值都在“右集”中

Code

int magnitudePole (const vector<int> &A) {  
   multiset<int> left, right;        
   int left_max, right_min;          
   int size = A.size();
   for (int i = 1; i < size; ++i)
       right.insert(A[i]);
   right_min = *(right.begin()); 
   if(A[0] <= right_min)
       return 0;
   left.insert(A[0]);
   for (int i = 1; i < size; ++i) {
       right.erase(right.find(A[i]));
       left_max = *(--left.end());
       if (right.size() > 0)
           right_min = *(right.begin());
       if (A[i] > left_max && A[i] <= right_min)
           return i;
       else
           left.insert(A[i]);
   }
   return -1;
}

我的问题

  • 我被告知我的逻辑不正确,我无法理解为什么这个逻辑不正确(尽管我已经检查了一些情况并且 它返回正确的索引)
  • 出于我自己的好奇心,如何在 O(n) 时间内不使用任何集合/多重集来做到这一点。

对于 O(n) 算法:

  1. 计算 [0, length(n)) 中所有 k 从 n[0] 到 n[k] 的最大元素,将答案保存在数组 maxOnTheLeft 中。这花费了 O(n);
  2. 计算 [0, length(n)) 中所有 k 从 n[k] 到 n[length(n)-1] 的最小元素,将答案保存在数组 minOnTheRight 中。这花费了 O(n);
  3. 循环遍历整个过程并找到任何 n[k] 且 maxOnTheLeft

你的代码(至少)在这里是错误的:

if (A[i] > left_max && A[i] <= right_min) // <-- should be >= and <=
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试 - 查找数组中的幅度极点 的相关文章

  • 如何确定算法函数的复杂度?

    您如何知道算法函数对于特定操作是否需要线性 常数 对数时间 它取决于CPU周期吗 您可以通过三种方式 至少 做到这一点 在网上查找算法 看看它是如何描述其时间复杂度的 根据输入大小 自己检查算法 查看嵌套循环和递归条件等内容 以及每个循环运
  • 解释一下从 N 个给定集合中的每一个中给出第 K 个最大数字的示例?

    今天我尝试解决一个Facebook 编程挑战赛 https facebook interviewstreet com recruit challenges 我遇到的挑战是 酒吧问题 可以找到here https github com alo
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 由周期表元素形成的最大单词的算法

    我想为以下问题场景编写一个算法 根据元素周期表元素的名称 找到可以组成的最大单词 符号如Na Ne等应被视为单个元素 这是在一家知名公司的求职面试中被问到的 有人可以帮我解决这个问题吗 我认为更好的方法是检查字典中的每个单词 看看是否可以从
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 包围一组点的多边形

    我有一组 S 点 2D 由 x 和 y 定义 我想找到 P 包围该组所有点的最小 含义 具有最少数量的点 多边形 P 是S 有没有已知的算法来计算这个 我在这个领域缺乏文化令人惊讶 感谢您的帮助 对于这个问题有很多算法 它被称为 最小边界框
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • 如何从迭代器推导连续内存

    不知何故 本土stl copy VC Dinkumware 上的算法表明它可以使用memcpy 可以轻松复制的数据 一个凡人能做到这一点吗 假设每个元素都是普通可复制的 random access iterator 是否意味着连续内存 标准
  • 归并排序中递归树的高度log(n)+1是怎么来的

    我按照 stackoveflow 的建议阅读了一些问题和答案 我正在遵循 cormen 的 算法简介 一书进行自学 那本书里已经解释得很清楚了 但唯一没有解释的是如何在合并排序分析中计算树的高度 如果在后面的章节中对此进行解释的话 我仍然在
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • n 或 nlog(n) 比常数时间或对数时间更好吗?

    在 Coursera 上的普林斯顿教程中 讲师解释了遇到的常见增长顺序函数 他说 线性和线性算术运行时间是 我们努力的目标 他的推理是 随着输入大小的增加 运行时间也会增加 我认为这是他犯了错误的地方 因为我之前听过他提到线性增长顺序对于高
  • 每个术语出现的次数

    我得到了一个数组a n 2 where n can be 10 5最大时有n个科目和n个学生 全部编号为 1 2 n a i 0 and a i 1 1 lt i lt n 表示在第 i 个科目中 所有来自a i 0 to a i 1 通过
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 依赖解析算法

    我正在编写一个包管理器 为此我希望依赖项解析尽可能强大 每个包都有一个版本列表 每个版本包含以下信息 具有可比性的 ID 依赖关系 软件包列表以及每个软件包的一组可接受的版本 冲突 软件包列表以及每个软件包的一组与该版本一起导致问题的版本
  • 找到一个数是素数,为什么检查到n/2更好。避免n后半部分的数字的原因是什么

    要检查一个数是否是素数 最简单的方法是尝试将这个数除以 2 到 n 如果任何操作得到余数为 0 那么我们就说给定的数不是素数 但最好只进行划分和检查直到 n 2 我知道更好的方法是直到 sqrt n 我想知道跳过后半部分的原因 假设我们是否
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这

随机推荐

  • 无法使用 JPA 获取与数据库的连接 - 缺少 derby 嵌入式驱动程序类

    我正在尝试使用 jpa 创建本地 derby 数据库 作为 JPA 实现 我使用 openjpa 并作为 sql 实现 derby 这是 persistence xml
  • Ruby 数组上未定义的方法“to_h”

    As per Ruby 数组文档 http ruby doc org core 2 2 0 Array html method i to h 有一个方法to h只要数组的每个元素是另一个包含两个元素的数组 就可以使用它将数组转换为哈希 以下
  • Android ListView,OnListItemClick,查找行id?

    我似乎无法找到如何获取我的 ListView OnListItemClick 以打开不同的活动 我知道我需要为 ListView 获取一些 row id 但我不知道如何做 现在 ListView 中的每一行都打开相同的活动 抱歉我的英语不好
  • JavaScript 的 for...in 循环如何处理多维数组?

    我在玩了一下 JavaScript 发现 至少对我来说 在通过 for in 循环处理多维数组时有奇怪的行为 所以我有这段代码
  • 在 C++ 中创建可修改的字符串文字

    是否可以在 C 中创建可修改的字符串文字 例如 char foo foo foo char afoo foo 0 afoo 2 g access violation 这会产生访问冲突 因为 foo 是在只读内存中分配的 我相信是 rdata
  • 什么时候应该使用各个线程同步对象?

    在什么情况下应该使用以下每个同步对象 读写锁 信号 Mutex 由于每次调用 post 时 wait 都会返回一次 因此信号量是一种基本的生产者 消费者模型 除了信号之外最简单的线程间消息形式 使用它们是为了让一个线程可以告诉另一个线程发生
  • 格式字符串参数不足

    我在Python中有这样的代码 def send start self player for p in self players player socket send cmd
  • 类型错误:“未定义”不是函数(评估“sinon.spy()”)

    我正在尝试使用sinon js http sinonjs org 在测试骨干应用程序时 但不幸的是 由于错误 我无法使用间谍方法 TypeError undefined is not a function evaluating sinon
  • 如何将 WPF 用户控件的宽度拉伸到其窗口?

    我有一个带有用户控件的窗口 我想让用户控件宽度等于窗口宽度 怎么做 用户控件是一个水平菜单 包含一个包含三列的网格
  • 系统windows窗体定时器参数

    如何将参数传递给System Windows Forms Timer private System Windows Forms Timer timer timer Interval 1000 timer Tick new EventHand
  • 如何将数据绑定到Spring表单中的列表

    我有一个带有支撑物体的弹簧形式 形式是这样的
  • 什么是 .htaccess 文件?

    我是 Zend 框架的初学者 我想了解更多关于 htaccess 文件及其用途 有人可以帮助我吗 我找到了一个这样的例子 htaccess 文件 AuthName Member s Area Name AuthUserFile path t
  • 转换为具体类并调用 Java 中的方法

    假设我们有一个名为A和一些子类 B C D ETC 大多数子类都有这个方法do 但基类没有 班级AA提供了一个方法叫做getObject 这将创建一个类型的对象B or C or D等 但将对象作为类型返回A 如何将返回的对象转换为具体类型
  • 如何使用salsa20计数器随机数?

    我不确定我是否做对了 消息计数器可以用作 代替随机数 我的意思是这样的消息 标头 2 字节 计数器 8字节 正文 n 字节加密 HMAC SHA1 计数器 1 63位 0 可以吗 我知道我不应该两次使用相同的密钥和相同的随机数 当新的连接启
  • 为什么Qt在qobject_cast、事件类型等方面重新实现RTTI?

    为什么 Qt 费心去重新实现相当于自定义 RTTI 系统和他们自己的系统 dynamic cast in the QObject层次结构 在QEvent etc 首先 Qt 中只有少数类层次结构实际上需要 RTTI 当您生成嵌入式代码时 您
  • 直接在Scipy稀疏矩阵上使用Intel mkl库以更少的内存计算A点A.T

    我想打电话mkl mkl scsrmultcsr https software intel com en us node 468640来自蟒蛇 目标是计算稀疏矩阵 C压缩稀疏行 http docs scipy org doc scipy 0
  • numpy.float64 不可迭代

    我正在尝试打印一个使用 numpy 数组和列表中的多个参数的函数 但我不断收到错误 numpy float 64 对象不可迭代 我在论坛上查看了关于这个主题的几个问题 并尝试了不同的答案 但似乎都不起作用 或者我可能做错了什么 我仍然是 p
  • Laravel查看路径错误

    当我更新视图文件时 我从旧路径获取视图文件 我有一个指向 IP vps 的域 我在其中安装了 laravel 让我们称之为 123 com 当我访问该域时 我会得到旧的视图路径 即我从中复制 Laravel 安装的文件夹的路径 该文件夹名为
  • 指定不同访问器中静态局部变量的构造/销毁顺序

    我遇到了崩溃cxa finalize运行一个程序 这是一个程序 而不是其中的库 ac test exe Assertion failed AcLock cpp 54 AcLock libc abi dylib terminate calle
  • 面试 - 查找数组中的幅度极点

    幅度极点 数组中左侧元素小于或等于它且右侧元素大于或等于它的元素 输入示例 3 1 4 5 9 7 6 11 期望的输出 4 5 11 我在面试中被问到这个问题 我必须返回元素的索引 并且只返回第一个满足条件的元素 My logic 取两个