The check for duplicate address should occur before the array of addresses is pushed to the players array. Functions should try to follow the checks, effects, interactions rule where first you do checks, then you make state changes, then you send funds, etc. In this case, you are placing a check after you have already potentially pushed duplicate players to the players array. This is low risk in this case because the function will revert if the duplicates check is failed.
Given that the function reverts if the duplicate players check is failed, this is fairly low risk, but at the very least you are spending gas to push people to the array and then revert if the duplicate check is failed.
Manual review
You are forced to use this approach because of the method you are using to check duplicates. But if you used a mapping to check for duplicates (as I suggest in a different finding), you would be able to do the check before you push the address to the array and then you would be able to follow checks. effects, interactions.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.