• + 0 comments
    def climbingLeaderboard(ranked, player):
    # Time: O(n + m) where n = len(ranked), m = len(player)
        # Space: O(m) for result storage (excluding input storage)
        # Initialize result list, ranked index (ri), and current rank
        result, ri, rank = [], 0, 1
        
        # Process player scores in reverse order (from highest to lowest)
        for pi in range(len(player) - 1, -1, -1):
            # Find the correct position in the ranked leaderboard for current player score
            while ri < len(ranked) and ranked[ri] > player[pi]:
                current_ranked_score = ranked[ri]
                # Skip all duplicates of the current ranked score
                # Since ranked is in descending order, duplicates are adjacent
                while ri < len(ranked) and current_ranked_score == ranked[ri]:
                    ri += 1
                # After skipping duplicates, increment rank (new unique score found)
                rank += 1
            
            # At this point, either:
            # 1. We've exhausted all ranked scores (player score is lowest)
            # 2. Found first ranked score <= player score (correct rank found)
            result.append(rank)
        
        # Reverse results to match original player score order
        return result[::-1]