80.Median-中位数(容易题)

原创 2016年08月31日 10:43:52

中位数

  1. 题目

    给定一个未排序的整数数组,找到其中位数。

    中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。

  2. 样例

    给出数组[4, 5, 1, 2, 3], 返回 3

    给出数组[7, 9, 4, 5],返回 5

  3. 挑战

    时间复杂度为O(n)

  4. 题解

1.Hashmap法,以空间换时间,时间复杂度为O(n)
先通过一次遍历得到最大值和最小值,并把元素值作为Hashmap的K、把元素出现的次数作为V。
需要注意的是中位数出现的位置应该是:

int count = n % 2 == 1 ? n / 2 + 1 : n / 2;

然后从最小值到最大值对Hashmap进行遍历,每找到一个元素就将count值减1(可以解释为什么count的下标为1而不是0),当count==0时Hashmap的K即是答案。

public class Solution {
    /**
     * @param nums: A list of integers.
     * @return: An integer denotes the middle number of the array.
     */
    public int median(int[] nums) {
        int min = nums[0];
        int max = nums[0];
        int n = nums.length;
        HashMap<Integer,Integer> hashmap = new HashMap<>();
        for (int i=0;i<n;i++)
        {
            int value = hashmap.containsKey(nums[i]) ? hashmap.get(nums[i])+1 : 1;
            hashmap.put(nums[i],value);
            min = min < nums[i] ? min : nums[i];
            max = max > nums[i] ? max : nums[i];
        }
        int count = n % 2 == 1 ? n / 2 + 1 : n / 2;
        for (int i = min;i<=max;i++)
        {
            while (hashmap.containsKey(i) && hashmap.get(i)>0)
            {
                --count;
                hashmap.put(i,hashmap.get(i)-1);
                if (count == 0)
                {
                    return i;
                }
            }
        }

        return Integer.MAX_VALUE;//表示出错
    }
}

2.Top K方法
本题的实质是查找数组中第(n-1)/2大的数,属于Top K问题,即使用快排思想解决问题,时间复杂度是O(n)。

public class Solution {
    /**
     * @param nums: A list of integers.
     * @return: An integer denotes the middle number of the array.
     */
    public int median(int[] nums) {
        return getMinK(nums,0,nums.length-1,(nums.length-1)/2);
    }

    private int getMinK(int[] nums, int left, int right, int k)
    {
        int i = left;
        int j = right;
        while (i != j)
        {
            while (nums[j] >= nums[left] && i < j)
            {
                j--;
            }
            while (nums[i] <= nums[left] && i < j)
            {
                i++;
            }
            swap(nums,i,j);
        }
        swap(nums,left,i);
        if (i == k)
        {
            return nums[i];
        }
        else if (i < k)
        {
            return getMinK(nums,i+1,right,k);
        }
        else
        {
            return getMinK(nums,left,i-1,k);
        }
    }

    private void swap(int[] nums, int i, int j)
    {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

Last Update 2016.8.31

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

MDX示例:求解中位数、四分位数(median、quartile)

采集获取知名招聘网站上的求职和招聘信息并通过商业智能开展职业职位供求及趋势等相关统计分析。何用MDX求解薪水中位数、四分位数(Median,Quartile)等。...

【数组】两个排序数组的中位数Median of Two Sorted Arrays

题目:找到两个排序数组的中位数, 两个数组大小分别是m和n, 要求时间复杂度是O(log(m+n)) 中位数:数组长度是基数,则中位数是中间值;数组长度是偶数,则中位数是中间两个数的算术平均值 ...

Leetcode刷题记—— 4. Median of Two Sorted Arrays(两有序数组的中位数)

一、题目叙述: There are two sorted arrays nums1 and nums2 of size m...

HackerRank Find Median(中位数)

题目链接 Problem Statement The median of a finite list of numbers can be found by arranging all the ...
  • xhf0374
  • xhf0374
  • 2015年12月18日 22:52
  • 147

LeetCode 295. Find Median from Data Stream(数据流中位数)

原题网址:https://leetcode.com/problems/find-median-from-data-stream/ Median is the middle value in an ...
  • jmspan
  • jmspan
  • 2016年04月16日 11:09
  • 401

LeetCode 4. Median of Two Sorted Arrays(两个有序数组的中位数)

原题网址:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an...
  • jmspan
  • jmspan
  • 2016年05月01日 15:39
  • 530

POJ3784 Running Median 对顶堆维护动态中位数(思维)

1.题目描述: Running Median Time Limit: 1000MS   Memory Limit: 65536K Total ...

两个有序数组的中位数Median of Two Sorted Arrays(很重要)

https://leetcode.com/problems/median-of-two-sorted-arrays/ 对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1]...

Find the median of two sorted arrays(找到两个排好序的数组的中位数)

原题是这样的: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the media...
  • wuh2333
  • wuh2333
  • 2016年09月19日 14:28
  • 267

Median of Two Sorted Arrays(求两个数组的中位数)

There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two ...
  • ylifam
  • ylifam
  • 2017年03月07日 00:08
  • 103
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:80.Median-中位数(容易题)
举报原因:
原因补充:

(最多只允许输入30个字)