Lintcode-中位数

作者: 爱秋刀鱼的猫 | 来源:发表于2017-02-22 10:13 被阅读383次

问题描述:

给定一个未排序的整数数组,找到其中位数。
中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。

思路一:

可以使用快速排序将数组排好序,然后返回中位数,这样做的时间复杂度是O(nlogn).

思路二:

为了降低复杂度,现在我们使用“折半的快速排序”。就是每一次只对一边的数组进行排序。

示例代码:
#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    /**
     * @param nums: A list of integers.
     * @return: An integer denotes the middle number of the array.
     */
    int Qsort(vector<int>&nums,int low,int high)//这里需要用引用
    {
        int i=low;
        int j=high;
        //int key=nums[0];
    //刚开始快速排序我一直是这么写的,然后一直AC不了。
//但是只测试快排又是可以运行出结果的,所以我一直以为是median函数里出错了。
//一直调试了很久很久,几个小时。所以这件事情也让我明白了基础扎实是很重要的。
        int key=nums[low];
        while (i<j)
        {
            while (i<j&&nums[j]>=key)
            {
                j--;
            }
            swap(nums[i],nums[j]);
            while (i<j&&nums[i]<=key)
            {
                i++;
            }
            swap(nums[i],nums[j]);
        }
        //nums[i]=key;
        return i;
    }

    int median(vector<int> &nums) {
        // write your code here
        int n=nums.size();
        int key=0,k=0;
        int left=0,right=n-1;
        if(n%2==0) key=n/2-1;
        else
        {
            key=n/2;
        }
        k=Qsort(nums,0,n-1);
        while (k!=key)
        {
            if(k<key)
            {
                left=k+1;
                k=Qsort(nums,left,right);
            }
            else
            {
                right=k-1;
                k=Qsort(nums,left,right);
            }
        } 
        return nums[key];
    }
};

注意点1:

int Qsort(vector<int>&nums,int low,int high)//这里需要用引用
    {
        int i=low;
        int j=high;
        //int key=nums[0];
               ....
         }

刚开始快速排序我一直是这么写的,然后一直AC不了。但是只测试快排又是可以运行出结果的,所以我一直以为是median函数里出错了。一直调试了很久很久,几个小时。所以这件事情也让我明白了基础扎实是很重要的。

注意点2:

int key=0,k=0;
        int left=0,right=n-1;
        if(n%2==0) key=n/2-1;
        else
        {
            key=n/2;
        }
        k=Qsort(nums,0,n-1);
        while (k!=key)
        {
            if(k<key)
            {
                left=k+1;
                k=Qsort(nums,left,right);
            }
            else
            {
                right=k-1;
                k=Qsort(nums,left,right);
            }
        } 

while循环里的left和right怎么控制,以及每次Qsort的上下限也要注意。

相关文章

  • Lintcode-中位数

    问题描述: 给定一个未排序的整数数组,找到其中位数。中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序...

  • 中位数的近似计算

    的公式求出中位数所在组的位置,然后再按下限公式或上限公式确定中位数。 Me——中位数;L——中位数所在组下限;U—...

  • 二分查找类题目小结

    问题的关键所在 两个中位数 区间选择 终止条件 两个中位数 下位中位数 上位中位数 区间的选择 开区间 闭区间 半...

  • LeetCode之Minimum Moves to Equal

    问题: 方法:首先,数学上中位数就存在距离和最小的特点,所以找出中位数然后遍历所有元素和中位数的距离和即得到最终结...

  • 295. 数据流的中位数

    中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 ...

  • 带权中位数

    带权中位数

  • Wiggle Sort II

    题目来源这道题的解法,我看了老半天,然后还是有点懵逼,先找中位数,然后比中位数大的和比中位数小的划分为两块,交换位...

  • 4. Median of Two Sorted Arrays

    中位数的定义:如果某个有序数组长度是奇数,那么中位数就是最中间的那个数;如果是偶数,那么中位数就是最中间两个数字的...

  • Java基本算法——二分查找算法

    二分查找算法 每次查找取数组中位数的值进行比较,如果目标值值大于中位数的值,则截取中位数右侧的数组再次进行二分查找...

  • LintCode-编辑距离

    给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。 你总共三种操作方法: 插...

网友评论

    本文标题:Lintcode-中位数

    本文链接:https://www.haomeiwen.com/subject/lrbpwttx.html