力扣1535 找出数组游戏的赢家(21.3.10)
力扣1535 找出数组游戏的赢家
题目描述:
给出一个由不同整数组成的整数数组arr和一个整数k
每回合比较数组前两个元素(arr[0]和arr[1]),较大的整数获胜并保留在位置0上。较小的整数则会移到数组的末尾。当一个整数赢得k个连续回合后。游戏结束,这个整数就是最后的赢家。
返回这个数。
涉及内容:数组
示例:

思路:
- 首先考虑当k大于数组总长度的情况,此时只需要返回最大值即可
- 当k小于数组总长度时,此时可以用直接求解法。
- 先设置一个连胜回合数标记符l
- 用a和b来读取arr[0]和arr[1]的值,并进行比较
- 若是a>b,则l+=1;若是b>a,则l=1
- 之后使用del方法去掉小的一方,再用append方法在末尾加上
- 每次循环之后设置一个对比的if函数,若是l==k了,则直接break跳出循环并返回此时的arr[0]值
提交结果:

完整代码:
def getWinner(arr, k):
l=0
if k>len(arr):
print(max(arr))
else:
while 1:
if l==k:
break
a=arr[0]
b=arr[1]
if a>b:
del arr[1]
arr.append(b)
l+=1
else:
del arr[0]
arr.append(a)
l=1
return arr[0]
if __name__ == "__main__":
arr = [2,1,3,5,4,6,7]
k = 2
print(getWinner(arr,k))

总结:这种暴力解法比较直观,但在时间和空间复杂度上来说开销比较大,因为涉及到了多次的数组运算。
解法2:
[1]: https://leetcode-cn.com/problems/find-the-winner-of-an-array-game/solution/pythonmo-ni-jie-fa-hen-jian-ji-by-miaoch/ "解法二出处"
借鉴了一种别人的优秀算法,这个问题从本质上来说:
一个数字能胜利几次,取决于该数字后面有连续几位数字比该数字小,且该数字必须是从开始到现在的最大值。黑体字部分的意思也就是说,如果这个数字是通过和前面数字对比上位的话,那么其比较在一开始就为1了,那么取决于该数字后面有连续几位数字时就需要少算一次。
例如arr=[1,2,6,4,5] 这里6在和2比较的时候,就自带了一次胜利回合。和后面的数字比较时就可以少算一次。(算法1中else部分 l=1也就是这个意思)
特别的,因为第一个数字前面没有比他更小的,所以第一个数字的胜利数要-1
如果所有数字都不满足,直接返回最大值就行了。(即第一趟不满足,但此时arr[0]肯定是最大值了,之后第二趟必满足,可以类比于k>len(arr)的情况。)
代码:
class Solution:
def getWinner(self, arr: List[int], k: int) -> int:
last = 0
for i in range(1, len(arr)):
if arr[i] > arr[last]:
if i - last + int(last != 0) > k:
return arr[last]
last = i
return arr[last]

浙公网安备 33010602011771号