zoukankan      html  css  js  c++  java
  • 剑指 Offer 39. 数组中出现次数超过一半的数字

    暴力法:

    class Solution {
        public int majorityElement(int[] nums) {
            //最容易想到暴力法
            int n = nums.length;
            if(n==1) return nums[0];
            Map<Integer,Integer> map = new HashMap<>();
            for (int num : nums) {
                if (map.containsKey(num)) {
                    int x = map.get(num);
                    if (x == n / 2) return num;
                    map.put(num, x + 1);
                } else {
                    map.put(num, 1);
                }
            }
            return -1;
        }
    }

     方法二:先排序

    class Solution {
        public int majorityElement(int[] nums) {
            //先对数组进行排序
            Arrays.sort(nums);
            int count = 1;
            int i = 1;
            int n = nums.length;
            if(n == 1) return nums[0]; 
            while(i<n){
                if(nums[i] == nums[i-1]) {
                    if (count == n / 2) return nums[i];
                    else {
                        count++;
                        i++;
                    }
                }else{
                    i++;
                    count = 1;
                }
            }
            return -1;
        }
    }

     方法三:双指针

    class Solution {
        public int majorityElement(int[] nums) {
            Arrays.sort(nums);  //双指针
            int i = 0,j=1;
            int n = nums.length;
            if(n == 1) return nums[0];
            while(j<n){
                if(nums[j] == nums[i]){
                    j++;
                }else{
                    if(j-i>n/2) return nums[j-1];
                    i = j;
                    j++;
                }
            }
            return nums[j-1];
        }
    }

     方法4:

    public int majorityElement(int[] nums) {
            Arrays.sort(nums);  
            return nums[nums.length/2];
        }


    快速排序,,,

    class Solution {
        public int majorityElement(int[] nums) {
            int n  = nums.length;
            sort(nums,0,n-1);
            int mid = n/2;
            return nums[mid];
        }
    
        private void sort(int[] nums, int start, int end) {
            int left = start-1;
            int right = end+1;
            int p = start;
            int num = nums[(left+right)/2];
            while(p<right){
                if(nums[p]<num){
                    swap(p++,++left,nums);
                }else if(nums[p]>num){
                    swap(p,--right,nums);
                }else p++;
            }
            if(left>start) sort(nums,start,left);
            if(right<end) sort(nums,right,end);
    
        }
    
        private void swap(int i, int small, int[] nums) {
            int temp = nums[i];
            nums[i] = nums[small];
            nums[small] = temp;
        }
    }

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    【ccf线上赛普及组 2020】
    【小总结】2020.3.6
    DP优化
    noip2012day2
    noip2012day1
    3.28真题
    数据结构总结
    noi online 普及组
    小总结
    20200229模拟赛
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/13535622.html
Copyright © 2011-2022 走看看