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;
    }

posted @ 2022-02-24 22:37  一颗青菜  阅读(7)  评论(0)    收藏  举报