169. 多数元素

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
最先想到的是排序,去中间,但是时间复杂度是nlgn,如何做到是lgn呢?参看其他人的想法:
// 首先想到就是排序,找到中间位置。但是时间复杂度是nlg(n),不是n
// 参考其他人的想法,由于一定有一半以上的相同元素,那么一一抵消。剩下的一定是那个元素
public int majorityElement(int[] nums) {
int target = nums[0];
int count = 0;
for(Integer num : nums) {
if(num == target) {
count++;
} else if (--count == 0) {
target = num;
count = 1;
}
}
return target;
}
分治思想的做法:
public int search(int[] nums, int l, int r) {
if(l==r) {
return nums[l];
}
int mid = l+(r-l)/2;
int num1 = search(nums,l,mid);
int num2 = search(nums,mid+1,r);
// 返回的数据是这个区间中个数最多的那个。
// 如果这个值是一样的。直接返回这个值
if(num1 == num2) {
return num1;
}
// 不一样,就分别判断这个区间中哪个值才是最多的
return count(nums,l,r,num1) > count(nums,l,r,num2) ? num1 : num2;
}
private int count(int[] nums, int l, int r, int target) {
int count=0;
for(int i=l;i<=r;i++) {
if(nums[i] == target) {
count++;
}
}
return count;
}
浙公网安备 33010602011771号