First thought, copy array -> sort array -> reverse sorted array -> nested loop, outer loop go through sorted array, inner loop go through original array and assign value to result when element found in the original array. Time complexity n^2.
Better way: sort index base on customized comparator. Comparator is comparing value of the array. Output of this step is a index array sorted based on the values. 2nd step is to fill the result. Time complexity is nlogn constrained by the java sorting implementation.
public class Solution {
public String[] findRelativeRanks(int[] nums) {
if(nums == null || nums.length == 0){
return null;
}
String[] result = new String[nums.length];
Integer[] index = new Integer[nums.length];
for(int i=0; i<index.length; i++){
index[i] = i;
}
Arrays.sort(index, (a,b)->(nums[b] - nums[a]));
for(int i=0; i<index.length; i++){
if(i == 0){
result[index[i]] = "Gold Medal";
} else if(i == 1){
result[index[i]] = "Silver Medal";
} else if (i == 2){
result[index[i]] = "Bronze Medal";
} else{
result[index[i]] = (i+1) + "";
}
}
return result;
}
}