已为我提供了一个元素数组和一个内置函数,该函数可以一次对5个元素进行排序。如何仅使用此函数来获取数组的最大3个元素,且对该函数的调用次数最少?
我尝试的方法是将数组分成5组,将函数应用于每个组,并将函数应用于从每个组获得的最大值。
当同一组中出现最高和第二高的值时,此方法将失败。有更好的方法吗?
答案 0 :(得分:4)
由于您具有对五个元素进行排序的内置方法,因此我建议:对数组中的前五个元素进行排序。重复丢弃五个中最小的两个,并用数组中另外两个元素(尚未考虑的两个元素)替换,然后再次对五个排序。最后,选择五个中最大的三个。
可能会做得比我素描的要好。假设您有25个元素。对于每5个一组,找到三个最大的组。然后在nos之间。从每组1个中找到三个最大的。否也一样。每组2个,第2个。 3.现在我们可以推断出三个最大的总数将在三个最大的否定之中。 1,两个最大的号码。 2和最大单号。 3,是六个元素,而不是9。因此,在对内置方法的另外两个调用中,而不是三个调用中,我们可以找到三个最大的元素。但是,将想法推广到原始数组的任何大小都会很复杂。
答案 1 :(得分:2)
#include <iostream>
void sortThree(int res[3]) {
for(int j = 0; j < 2; j++) {
if(res[j] > res[j+1])
std::swap(res[j], res[j+1]);
}
if(res[0] > res[1]) std::swap(res[0], res[1]); // second pass
}
bool lsearch(int src[], int n, int k) {
for(int i = 0; i < n; i++) {
if(src[i] == k) return true;
}
return false;
}
void getThreeLargest(int arr[], int n, int res[3]) {
res[0] = arr[0];
res[1] = arr[1];
res[2] = arr[2];
sortThree(res);
for(int i = 3; i < n; i++) {
// if no repetition wanted
// if(arr[i] > res[0] && !lsearch(res, 3, arr[i])) {
if(arr[i] > res[0]) {
res[0] = arr[i];
sortThree(res);
}
}
}
int main(int argc, char *argv[])
{
int arr[] = {91,21,3,-4,5,2,1,90,9,11};
int res[3];
getThreeLargest(arr, 10, res);
for(int i = 0; i < 3; i++)
std::cout << res[i] << '\n';
return 0;
}
非常简单的解决方案,以C方式实现。您可以轻松地将其转换为Java。扫描阵列为O(n)。由于要排序和搜索的小数组只有3个元素,因此我们可以轻松地使用线性搜索来避免重复,排序仅需进行2个比较。仍然是O(n)。
答案 2 :(得分:1)
这种方法怎么样。
答案 3 :(得分:0)
我不确定您正在使用什么工具,但是解决此问题的最简单方法是这样的。
:: trial example
set S3_COMMAND_STR=aws s3api put-object --bucket %S3_BUCKET% --key %S3_SEND_DIR%/%FILE_NAME% --body %SEND_FILE% --metadata md5chksum=%HashBase64% --content-md5 %HashBase64%
:: Uploaded Result Get
for /F %%A in ('%S3_COMMAND_STR%') do (set S3_RESULT=%%A)
-- Return Command Error
File aws was not found.
我建议添加更多信息以获得更好的答案。
希望这会有所帮助。
答案 4 :(得分:-1)
#include<stdio.h>
#include<limits.h>
int retmax(int *a,int n,int exc){
int max = INT_MIN;
for(int i=0;i<n;i++){
if(a[i] > max && a[i] < exc)
max = a[i];
}
return max;
}
int main(){
int a[]={32,54,12,43,98,45,87};
int size = sizeof(a)/sizeof(a[0]);
int x = retmax(a,size,INT_MAX);
int y = retmax(a,size,x);
int z = retmax(a,size,y);
printf("%d %d %d",x,y,z);
}
一个简单的O(n)解决方案。