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

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    JS事件冒泡、事件捕获和事件委托
    实现英文字母排序
    JavaScript异步加载的四种方法
    JavaScript作用域与作用域链
    JavaScript 自定义属性 data-*
    asycn和await
    style collectd
    JavaScript如何比较两个数组的内容是否相同
    VScode插件开发--M2D文档转换插件
    BOM笔记
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/13535622.html
Copyright © 2011-2022 走看看