2024-5-19
- 题目来源
- 我的题解
- 方法一 纯模拟
- 方法二 一次遍历
题目来源
力扣每日一题;题序:1535
我的题解
方法一 纯模拟
排除一种情况:当k>=n-1时,至少会遍历数组一遍,实质就是求数组的最大值。
其余的情况使用List来进行模拟操作
时间复杂度:
空间复杂度:
public int getWinner(int[] arr, int k) {int n=arr.length;//若需要循环一轮,则必然是最大那个值if(k>=n-1)return Arrays.stream(arr).max().getAsInt();List<Integer> list=new ArrayList<>();for(int i=0;i<n;i++)list.add(arr[i]);int res=Math.max(arr[0],arr[1]);while(true){//记录连续的次数int t=k;//保存上一个最大值int pre=0;int t1=list.get(0),t2=list.get(1);if(t1>t2){pre=t1;list.remove(1);list.add(t2);}else{pre=t2;list.remove(0);list.add(t1);}t--;while(t>0){t1=list.get(0);t2=list.get(1);int curP=Math.max(t1,t2);//若最大值与上一次相同,表示连续,连续次数减1if(curP==pre){t--;//否则需要以新的最大值重新开始}else{break;}if(t1>t2){list.remove(1);list.add(t2);}else{list.remove(0);list.add(t1);}}if(t==0){res=pre;break;}}return res;
}
方法二 一次遍历
实质只需要一次遍历比较就能知道答案
时间复杂度:O(n)
空间复杂度:O(1)
public int getWinner(int[] arr, int k) {int n=arr.length;int max=arr[0];for(int i=1,count=0;i<n;i++){if(max<arr[i]){max=arr[i];count=1;}else{count++;}if(count==k){break;}}return max;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~