• 169 Majority Element 求众数 数组中出现次数超过一半的数字


    给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
    你可以假设数组是非空的,并且数组中的众数永远存在。

    详见:https://leetcode.com/problems/majority-element/description/

    Java实现:

    方法一:

    class Solution {
        public int majorityElement(int[] nums) {
            int n=nums.length;
            if(n==0||nums==null){
                return -1;
            }
            int num=nums[0];
            int cnt=1;
            for(int val:nums){
                if(val==num){
                    ++cnt;
                }else{
                    --cnt;
                    if(cnt==0){
                        num=val;
                        cnt=1;
                    }
                }
            }
            cnt=0;
            for(int val:nums){
                if(val==num){
                    ++cnt;
                }
            }
            if(2*cnt>n){
                return num;
            }
            return -1;
        }
    }
    

    方法二:

    class Solution {
        public int majorityElement(int[] nums) {
            int n=nums.length;
            if(n==0||nums==null){
                return -1;
            }
            int low=0;
            int high=n-1;
            int mid=n>>1;
            int index=partition(nums,low,high);
            while(index!=mid){
                if(index>mid){
                    high=index-1;
                    index=partition(nums,low,high);
                }else if(index<mid){
                    low=index+1;
                    index=partition(nums,low,high);
                }
            }
            int num=nums[mid];
            int cnt=0;
            for(int val:nums){
                if(val==num){
                    ++cnt;
                }
            }
            if(2*cnt>n){
                return num;
            }
            return -1;
        }
        private int partition(int[] nums,int low,int high){
            int pivot=nums[low];
            while(low<high){
                while(low<high&&nums[high]>=pivot){
                    --high;
                }
                nums[low]=nums[high];
                while(low<high&&nums[low]<=pivot){
                    ++low;
                }
                nums[high]=nums[low];
            }
            nums[low]=pivot;
            return low;
        }
    }
    

    python实现:

    参考:http://www.cnblogs.com/grandyang/p/4233501.html

  • 相关阅读:
    const
    ImportError: No module named google.protobuf
    ImportError: No module named google.protobuf
    多线程同步与单线程异步对比
    多线程同步与单线程异步对比
    再谈select, iocp, epoll,kqueue及各种I/O复用机制
    再谈select, iocp, epoll,kqueue及各种I/O复用机制
    poj1180
    poj3254
    poj3321
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8729524.html
Copyright © 2020-2023  润新知