文章目录
- 题目链接
- 题目描述
- 思路
- 代码
题目链接
2780.合法分割的最小下标
题目描述
思路
这道题是摩尔算法的一种扩展
我们先可以找到候选人出来,然后去计算他在左右两边元素出现的次数,只有当他左边时,左边出现的次数2 >左边的长度,右边出现的次数2>右边的长度时 他才算做支配元素
先计算候选人在数组出现的总次数,然后再分别算左右出现的次数,然后算出
左边出现的次数2 >左边的长度,右边出现的次数2>右边的长度 此时的下标多少
代码
public int minimumIndex(List<Integer> nums) {int goal = findNum(nums);int count =0;for(int i=0;i<nums.size();i++){if(nums.get(i) ==goal)count++;}//左边众数出现的次数int countLeft =0;//右边众数出现的次数int countRight = count;//左边数组的元素个数int sizeLeft =1;//右边数组的元素个数int sizeRight = nums.size()-1;for(int i=0;i<nums.size();i++,sizeLeft++,sizeRight--){//记录当前元素int x =nums.get(i);if(x== goal){countLeft++;countRight--;}if(countLeft *2 >sizeLeft && countRight *2>sizeRight)return i;}return -1;}public int findNum(List<Integer> nums){int goal = 0;//候选人int count = 0;//候选人的票数for(int i=0;i<nums.size();i++){if(count == 0){goal = nums.get(i);count = 1;} else if(nums.get(i) ==goal){count++;}else{count--;}}return goal;}
感谢您的收看!!!