例如a[ ]= {45,6,12,44,43,88,32,88,12,88,4,56}
最大数是:88
第一个88 对应索引是5
第二个88 对应索引是7
第二个88 对应索引是9
如果没有相同的最大值就打印最大值及其索引,如果有相同的,把相同的索引全部打印出来。我这里遇到了点问题
用一个数组存储下标就可以了,代码如下:
#include <iostream>
using namespace std;
int main()
{
int a[]= {45,6,12,44,43,88,32,88,12,88,4,56};
int n = sizeof(a)/sizeof(int);
int i,k=0,max = a[0]; //k用来保存最大数的个数
int *index = new int[n];//用来存储最大数的下标
index[0] = 0;
for(i =1;i<n;i++)
{
if(a[i] > max)
{
max = a[i];
k = 0; //k重置为0
index[k++] = i;
}else if(a[i] == max)
{
index[k++] = i; //记录最大值下标
}
}
//显示最大值
for(i=0;i<k;i++)
{
if(i != k-1)
cout << index[i] << " ";
else
cout << index[i] << endl;
}
//释放内存
delete[] index;
index = 0;
return 0;
}
几种办法吧,一是把当前最大值及其索引存储到一个数组里,如果有新的最大值,则清空数组,只记录新的最大值,如果与最大值相等, 则加入数组;二是先遍历一遍获得最大值,然后再次遍历输出与最大值相等的元素的下标。都是可以的。前者罗嗦一些,效率也不一定高,后者多循环一遍,但简单
int main()
{
int a[]= {45,6,12,44,43,88,32,88,12,88,4,56};
int n = sizeof(a)/sizeof(int);
int i,max = a[0];
for(i=1;i<n;i++)
if(a[i] > max)
max = a[i];
printf("最大值为%d\n",max);
int count = 0;
for(i=0;i<n;i++)
if(a[i] == max)
{
printf("第%d个最大值下标为:%d\n",count++,i);
count++;
}
return 0;
}
最好的方法是STL的max_element,轮子都给你造好了。
头文件:#include<algorithm>
时间复杂度:O(n) (n为开始指针至结尾指针的长度)
用法:max_element(起始指针,结束指针,比较函数)
返回:
最大元素的指针(可以减去起始指针获取下标)