c++ 给定一个数组 怎么找出最大的值和其对应的索引,如果最大值有多个呢

例如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(起始指针,结束指针,比较函数)
返回:
最大元素的指针(可以减去起始指针获取下标)