Leetcode 1535. Find the Winner of an Array Game
题目链接: Find the Winner of an Array Game
难度:Medium
题目大意:
给出一个数组,将数组第一个元素和第二个元素相比较,胜者排到第一个,败者排到数组最后。输入整数k,求按照这个规则第一个连续获胜k次的数。
思路:
思路1:
用List来模拟这个游戏规则,寻找符合题意的数。注意k如果非常大的话会超时,如果k大于等于数组长度减一,即要寻找比除自己外的其它k-1个都大的数,那就是数组中最大的数,直接返回这个数即可。
思路2(参考高赞回答):
k如果非常大的话会超时,如果k大于等于数组长度减一,返回最大的数即可。遍历整个数组,分别用cur和win来记录当前较大的数以及连续获胜的次数,如果找到连续获胜k次的数就返回,遍历完整个数组也没有找到,cur就是数组最大的数,那么cur一定能连续获胜k次(不管k多大)。不用管将较小的数放在数组末端这个操作,用数组就能实现,时间复杂度与空间复杂度也比思路1低很多,非常巧妙而又简单的解法。
代码
思路1:
class Solution {
public int getWinner(int[] arr, int k) {
int count=0;
int len=arr.length;
List<Integer> list = new ArrayList<Integer>();
for(int n:arr){
list.add(n);
}
if(k>=len-1){
return Collections.max(list);
}
while(count<k){
if(list.get(0)>list.get(1)){
count++;
Integer item=list.remove(1);
list.add(item);
}
else{
count=1;
Integer item=list.remove(0);
list.add(item);
}
}
return list.get(0).intValue();
}
}
思路2:
class Solution {
public int getWinner(int[] arr, int k) {
//参考高赞回答
int cur=arr[0];//当前较大的数
int win=0;//连续获胜的次数
for(int i=1;i<arr.length;i++){
if(arr[i]>cur){
cur=arr[i];
win=0;
}
win++;//如果arr[i]<cur,win++,即使arr[i]>cur,arr[i]获胜一次,win也要加一
if(win==k){
break;
}
}
return cur;
}
}