• + 0 comments

    C# version with binary search:

        public static int FindRankBinary(List<int> data, int value)
        {
            var left = 0;
            var right = data.Count - 1;
            
            while (left < right)
            {
                var mid = Convert.ToInt32(Math.Ceiling((right - left) / (decimal)2) + left);
                
                if (data[mid] == value)
                {
                    return mid;
                }
                
                if (mid == right)
                {
                    return data[mid] < value ? mid : mid + 1;
                }
                    
                if (data[mid] > value)
                {
                    left = mid;
                }
                else
                {
                    right = mid;
                }
            }
            
            return data.Count;
        }
    
        public static List<int> climbingLeaderboard(List<int> ranked, List<int> player)
        {
            var result = new List<int>();
            var rankedDeduplicated = new List<int>();
            
            var rank = 0;
            rankedDeduplicated.Add(ranked[0]);
            for (var i = 1; i < ranked.Count; i++)
            {
                if (ranked[i] != ranked[i-1])
                {
                    rank++;
                    rankedDeduplicated.Add(ranked[i]);   
                }
            }
            
            for (var j = 0; j < player.Count; j++)
            {
                if (player[j] >= ranked[0])
                {
                    result.Add(1);
                    continue;
                }
                
                result.Add(FindRankBinary(rankedDeduplicated, player[j]) + 1);
            }
            
            return result;
        }