碎碎念
好几天没写文了,但其实每天都有上去看题(例如昨天的蚂蚁相撞),也都有在跟朋友讨论。
这几天有很多可以用外乡人作法来处理的题目,感觉是蛮有趣的。
题干
给一个长度的array,里面有各种数字,要取前两个比大小,赢的人留下来,输的丢到数组的最后面,返回先赢了k次的数字
解题思路
这题虽然是中等,但感觉其实没有那么难。也许是因为这几天都是抖机灵的题目,我直接就开始想要怎么跳过那些数组替换的步骤。
于是我就在想,如果输了一次,就代表他不可能赢,所以我只需要跑过一整个数组,看谁会在前面赢到指定次数。也就是说,除了第一个数之外,后面的都是去检查后面k-1个数是否比他大。
class Solution: def getWinner(self, arr: List[int], k: int) -> int: current_winner = arr[0] win_count = 0 for i in range(1, len(arr)): if arr[i] > current_winner: current_winner = arr[i] win_count = 1 else: win_count += 1 if win_count == k: return current_winner # 如果我们已经比较了足够多的次数,超过了数组长度,那么当前的最大元素是无敌的 if i - win_count > len(arr): break return current_winner
我根本不管把数字删除跟丢到后面的部分,直接开始比。反正win-count都是从一开始,就直接看什么时候新数字可以到目标k这样。