Question: Question: Candidates can attempt an entrance exam as many times as they wish. The average score of all attempts is considered in the end. Given a list of scores. find the candidate with the highest score [ average score].

```
String scores[][] = {{"Ram","155"}, 
                    {"Shyam","145"},
                    {"Ram","156"},
                    {"Balram","159"},
                    {"Balram","150"},
                    {"Ram","135"},
                    {"Mira","156"},
                    {"Mira","152"},
                    {"Shyam","155"}};

```

Scores are given in two-dimensional array as above. Need suggestions to solve this in efficient way.

Answer: 
What is the reason for reducing the time and space complexity? I strongly believe the brevity and maintainability are more important than the performance.

Since you tagged [java-stream](/questions/tagged/java-stream "show questions tagged 'java-stream'"), I can suggest you the following approach.

```
Map<Object, Double> scoreMap = Arrays.stream(scores)
        .collect(
            Collectors.groupingBy(i -> i[0], 
            Collectors.averagingInt(i -> Integer.parseInt(i[1])
        )));

String winner = scoreMap.entrySet().stream()
    .max(Comparator.comparingDouble(e -> e.getValue()))
    .get().getKey().toString();

```

Thanks to @AndyTurner for the `.max(..)` parameter suggestion.
Also, by this way, You can do the same via `Streams` Api,

```
import java.util.stream.*;
import java.util.*;
public class Solution {
  public static void main (String[] args) {
    String scores[][] = {{"Bob","80"},{"Charles","85"},{"Rob","70"},{"Bob","100"},{"Charles","75"}};

 Map<Object,Double> collectValues = Arrays.stream(scores).collect(Collectors.groupingBy(a->a[0],Collectors.averagingInt(a->Integer.parseInt(a[1]))));

    Map.Entry<Object,Double> MaxMarks = collectValues.entrySet().stream().max((e1,e2)->Double.compare(e1.getValue(), e2.getValue())).get();

    System.out.println(MaxMarks.getKey() + " :: " + MaxMarks.getValue());

}

```