- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近在某处遇到了一个非常好的面试问题,我想请教各位天才,对此最优化的解决方案是什么。所以问题如下:给定一个整数数组,找到一个最大数 n,使得至少有 n 个数组元素大于 n。输入数组未排序。
例如:
输入:1,2,5,7,8,10 输出:n = 4
输入:0,2,7,8,19,5,45,9,23 输出:n = 6
我能想到的一个解决方案(如果数组已排序)是顺序扫描数组中的所有元素以找出 min:n 和 max:n。然后递增 min:n 到 max:n 之间的整数,并一一检查。但这是 O(N) 解决方案。有人可以建议一个更好的吗?
例如:对于输入 1 min:n = 2 和 max:n = 5
然后您将检查数字 2、3 和 4 作为答案。
从答案来看,如果数组未排序,没有比 O(N) 更好的解决方案。但下一个问题是如果给定数组已排序怎么办?
pseudocode :
// this assumes sorted input.
pubic int findhighestIndex(List<Integer> input){
it min=0,max=0,n=0,maxIndex=0;
for(int i=0;i<input.size();i++){
if( input.get(i)>(input.size()-i) ){
max=input.get(i);
maxIndex=i;
min=input.get(i-1);
break;
}
else if(input.get(i)<(input.size()-i)){
max=min=input.get(i);
}
}
int i=max;
while( i>=min && (input.size()-maxIndex)<i ){
i--;
}
System.out.println(i);
}
更新:这个问题也被称为寻找h-index
最佳答案
编辑:刚刚找出 O(n)
未分类案例的解决方案 :) 见下文!
这可以在 O(log N
中解决) 对于排序数组,通过对 n
进行二进制搜索.我将在这里使用 OP 的符号,其中 N = # of elements
和 n
是我们正在寻找的答案。
如果数组是有序的,那基本上意味着我们需要找到一个位置[N - n]
以便数组中的此类位置包含大于 n
的值- 如果是,那么至少有 n
大于它的值,无论重复值如何。
请注意,答案始终是可能的,因为在最坏的情况下,答案将是 0
, 并且总有至少 0 个元素比它大。对于较低的值,答案总是变得“更容易”,显然,因为找到 1 个大于 1 的元素比找到 10 个大于 10 的元素更容易。但更重要的是,这个函数遵循单调(非递减)行为,这让我们对其使用二进制搜索。
思路如下:
int N = 9;
int arr[10] = {0,2,5,7,8,9,19,23,45};
int lo = 0, hi = N+1, mid;
while(hi-lo > 1){
mid = (hi+lo)/2;
if(arr[N-mid] > mid) lo = mid;
else hi = mid;
}
n = lo; //highest value that worked
分割:数组的大小为 9
.二进制搜索可能会开始尝试值 n = 5
, 所以我们只检查数组末尾的第 5 个元素是否大于 5。在这种情况下,8 > 5
所以我们可以尝试更好的答案。然后搜索将尝试 7
, 但位置为 [N-7]
的元素是5
,低于 7,不满足我们的约束条件。因此搜索的最后一次尝试是值 6
,返回 true 作为 7 > 6
.
对于未排序的情况,这个想法非常相似!我们可以在O(n)
解决通过使用 Selection Algorithm识别第[N-n]个元素,并在每一步以与二进制搜索相同的方式划分搜索空间。
我们从 [0]
开始搜索至 [N-1]
找到中位数 (N/2 th)
元素,我们可以在另一个 O(N)
中重新排列数组步骤使得中间元素被放置在正确的位置,并且它之前的每个元素都具有值 <= median
,而它后面的每个元素都有一个值 >=median
.
现在,如果该值大于 n
(在本例中为 N/2
),我们在上面显示至少有 n
大于 n
的元素, 因此我们只需要在数组的下半部分进一步搜索。 (如果中值低于 n
,我们只考虑数组的较大一半)
现在,假设 median >= N/2
我们将从索引 [0]
重复相同的过程至 [N/2]
, 在 O(N/2)
中使用选择“排序” ,依此类推,每次将搜索空间除以2。
C++代码如下:
int N = 9;
int arr[9] = {0,2,7,8,19,5,45,9,23};
int lo = 0, hi = N, mid;
while(hi-lo > 1){
mid = (hi+lo)/2;
std::nth_element(arr+lo, arr+mid, arr+hi);
if(arr[mid] > N-mid) hi = mid;
else lo = mid;
}
n = N-hi;
最后,我们实现了 O(N) + O(N/2) + O(N/4) + ... = O(2*N) = O(N)
的复杂度
关于arrays - 数据结构面试: find max number in array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17416233/
总览 数据库的数据存储有两种类型,一种是面向行的(row-oriented)数据库,另一种是面向列的(column-oriented )数据库。 面向行(事务型) 数据库 该类数据库是根据
starting from a joke 问:把大象放冰箱里,分几步? 答:三步啊,第1、把冰箱门打开,第2、把大象放进去,第3、把冰箱门带上。 问:实现spring事务,分几步? 答:三
在最近的一次采访中,我有这个问题。 这里有什么错误?我知道足够的 c#,但我看不到错误。可以吗? Class x { protected string t1; public int
我在面试中被要求设计一个文件系统,允许用户将自己的属性添加到文件和文件夹中。我刚刚说过要将属性添加到文件描述符并允许根据此属性标准搜索文件,以及添加此属性以显示在文件/文件夹详细信息中。 看起来面试官
我一直在面试,下面应该有什么问题? 我可以假设这是您无法检查类是否为空的问题,对吗?!谢谢! public class NiceActivity extends Activity { priv
给定一个数组,如何返回总和为偶数的对数? 例如: a[] = { 2 , -6 , 1, 3, 5 } 在这个数组中,偶数和的对数是(2,-6), (1,3) , (1,5), (3,5) 函数应返回
这个问题是在面试中被问到的 Assume you have a dictionary of words: (use if you have /usr/share/dict/words). Given
我被要求实现 invert(x,p,n) 返回 x 的 n 位开始于位置 p 反转(即 1 变为 0,反之亦然),其他不变。 我的解决方案是: unsigned invert(unsigned x,
有人问我这个问题:给定一个大小为 n 的 int 和 int sum 的数组,我需要返回数组元素的所有对,其总和等于 总和 std::vector > find(int* arr,size_t n,i
我在一次面试中遇到了这个问题。有一组对象与起始值和结束值相关联。与每个对象相关联的计数是具有较长开始时间和较短结束时间的其他对象的数量。所以我必须找到与每个对象关联的计数。 我提出了 O(n^2) 解
我今天在采访中被问到这个问题。我已经尝试了一种解决方案,但想知道是否有更好的方法来解决这个问题: 问题:我有一个包含 500,000 个元素的数组列表,这样数组列表的每个元素的值都与索引相同。例如:l
有一个包含白色单元格,黑色单元格和只有一个灰色单元格的矩阵,需要从 (0,0) 到 (N-1, N-1) 如果 Arra[N][N]约束:A。该路径应该只覆盖白色单元格并且应该通过灰色单元格。b.访问
给定一个正整数数组,找出排列的任意排列可以形成的最大值。我想知道是否有更好的数据结构可以为问题提供更优雅的解决方案。 import java.util.ArrayList; import java.u
我在面试中被问到以下问题(不幸的是我找不到比 N^2 更好的答案) 对于大小为 N 的 unsigned int 的给定数组 arr,对于每个元素(在索引 i 中)我应该返回一个元素在索引 j (j
极点:数组中左侧元素小于或等于它且右侧元素大于或等于它的元素。 示例输入 3,1,4,5,9,7,6,11 期望的输出 4,5,11 面试时被问到这个问题,要返回元素的索引,只返回第一个满足条件的元素
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我今天被问到这个问题,我知道答案很简单,但他让我一直到最后。 问题 编写程序删除存储在 ArrayList 中的偶数,其中包含 1 - 100。 我只是说哇 给你,这就是我的实现方式。 ArrayLi
我在一次采访中遇到了这个问题,完全被难住了。我能想到的唯一解决方案是将 currentAngle 存储在 NSArray 中以计算下一个角度。 问题:使用 iPhone 的指南针在屏幕上移动一个 35
我必须在接下来的几周内采访一些 C++ 候选人,作为公司最资深的程序员,我应该尝试弄清楚这些人是否知道他们在做什么。 那么有人有什么建议吗? 就我个人而言,我讨厌被留在房间里填写一些 C++ 问题,所
消息队列(MQ),一种能实现生产者到消费者单向通信的通信模型,这也是现在常用的主流中间件。 常见有 RabbitMQ、ActiveMQ、Kafka等 他们的特点也有很多 比如 解偶、异步、广播
我是一名优秀的程序员,十分优秀!