Skip to content

LeetCode

数组

剑指53 - I. 在排序数组中查找数字 I

排序中的搜索问题,首先考虑二分

剑指 Offer 53 - II. 0~n-1中缺失的数字

考点主要还是二分法,题目每个条件都是有用的。所有题都拿来遍历,offer也就遍历到别人那里去了

根据题意,数组可以按照以下规则划分为两部分。

  • 左子数组: nums[i] = inums[i]=i ;
  • 右子数组: nums[i] != nums[i] ;

缺失的数字等于 “右子数组的首位元素” 对应的索引;因此考虑使用二分法查找 “右子数组的首位元素”

class Solution 
{
    public:
        int missingNumber(vector<int>& nums) 
        {
            if(nums.size() == 0)
            {
                return -1;
            }

            int left = 0, right = nums.size() - 1;
            while(left <= right)
            {
                int mid = (left + right)/2;
                if(nums[mid] != mid)
                {
                    right = mid - 1;
                }
                else
                {
                    left = mid + 1;
                }
            }
            return left;
        }
};

优先队列 / 堆

剑指offer41.数据流中的中位数

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

实现:   1.每插入一个数之前,先判断两个堆的 size() 是否相等。 2.若相等,先将这个数插入大顶堆,然后将大顶堆的 top() 插入小顶堆。这么做可以保证小顶堆的所有数永远大于等于大顶堆的 top()。   3.若不相等,先将这个数插入小顶堆,然后将小顶堆的 top() 插入大顶堆。这么做可以保证大顶堆的所有数永远小于等于小顶堆的 top()。  

class MedianFinder 
{
    public:
        /** initialize your data structure here. */

        priority_queue<int, vector<int>, less<int> > maxheap;
        priority_queue<int, vector<int>, greater<int> > minheap;

        MedianFinder() {}

        void addNum(int num) 
        {
            if(maxheap.size() == minheap.size()) 
            {
                maxheap.push(num);
                minheap.push(maxheap.top());
                maxheap.pop();
            }
            else 
            {
                minheap.push(num);
                maxheap.push(minheap.top());
                minheap.pop();
            }
        }

        double findMedian() 
        {
            int maxSize = maxheap.size(), minSize = minheap.size();
            int mid1 = maxheap.top(), mid2 = minheap.top();
            return maxSize == minSize ? ((mid1 + mid2) * 0.5) : mid2;
        }
};

队列:先进先出 优先队列: 1.最大优先队列,无论入队顺序,当前最大的元素优先出队。 2.最小优先队列,无论入队顺序,当前最小的元素优先出队。