首页 > 其他分享 >9.21Leetcode记录

9.21Leetcode记录

时间:2022-09-21 20:22:28浏览次数:85  
标签:9.21 nums 记录 中位数 addNum num 数组 queMin Leetcode

一、数据流中的中位数

题目

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

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。

示例 1:

输入:
["MedianFinder","addNum","addNum","findMedian","addNum","findMedian"]
[[],[1],[2],[],[3],[]]
输出:[null,null,null,1.50000,null,2.00000]

示例 2:

输入:
["MedianFinder","addNum","findMedian","addNum","findMedian"]
[[],[2],[],[3],[]]
输出:[null,null,2.00000,null,2.50000]

限制:

  • 最多会对 addNum、findMedian 进行 50000 次调用。

题解

需要用到优先队列的思想,分别记录大于中位数queMax和小于等于中位数queMin的数。

当累计添加的数为奇数时,queMin 中的数的数量比queMax 多一个,此时中位数为 queMin 的队头。

当累计添加的数为偶数时,此时中位数为qunMin和queMax的队头的平均值。

当区要添加一个数时,进行讨论:

①num<=max(queMin)

num小于中位数,将其添加到queMin,新的中位数将小于等于原来的中位数,因此需要将queMin中的最大数移到queMax中。

②num>max(queMin)

num大于中位数,将其添加到queMax,新的中位数大于原来的,需要将queMax中的最小数移到queMin中。

特殊:注意当新添加一个数时,默认到queMin队列中。

代码

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

    priority_queue<int, vector<int>, less<int>> queMin;
    priority_queue<int, vector<int>, greater<int>> queMax;
    
    MedianFinder() {
       
    }
    
    void addNum(int num) {
        if(queMin.empty()||num<=queMin.top())
        {
            queMin.push(num);
            if(queMax.size()+1<queMin.size())
            {
                queMax.push(queMin.top());
                queMin.pop();
            }
        }
        else
        {
            queMax.push(num);
            if(queMin.size()<queMax.size())
            {
                queMin.push(queMax.top());
                queMax.pop();
            }
        }
        
    }
    
    double findMedian() {
        if(queMin.size()>queMax.size())
            return double(queMin.top());
        else
            return (queMin.top()+queMax.top())/2.0;
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */

 二、把数组排成最小的数

题干:

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例 1:

输入: [10,2]
输出: "102"

示例 2:

输入: [3,30,34,5,9]
输出: "3033459"

提示:

0 < nums.length <= 100
说明:

输出结果可能非常大,所以你需要返回一个字符串而不是整数
拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

题解

对数组进行排序,排序时进行比较,选择两个数加起来较小的一方。

代码

class Solution {
public:
    string minNumber(vector<int>& nums) {

        vector<string> strs;
        for(auto num:nums)
        {
            strs.push_back(to_string(num));
        }
        sort(strs.begin(),strs.end(),comp);
        string ans;
        for(auto str:strs){
            ans+=str;
        }
        return ans;
    }

    static bool comp(string a,string b)
    {
        return a+b<b+a;
    }


};

三、连续子数组的最大和

题干

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

提示:

  • 1 <= arr.length <= 10^5
  • -100 <= arr[i] <= 100

题解

对于数组中的每个数,找出以他为终点的子数组最大和,因此只需将:目前的数+前一个数的子数组最大和>目前的数,则目前的数为加和之后的。

对整个数组遍历一遍,即可求出每个位置上的以他为终点的子数组的最大和。

代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
    int a_max=nums[0];
    int maxn=a_max;

    for(int i=1;i<nums.size();i++)
    {
        if(nums[i]+nums[i-1]>nums[i])
        {
            nums[i]=nums[i]+nums[i-1];
            maxn=max(nums[i],maxn);
        }
        else
        {
            maxn=max(nums[i],maxn);
        }
    }
    return maxn;

    }
};

 

标签:9.21,nums,记录,中位数,addNum,num,数组,queMin,Leetcode
From: https://www.cnblogs.com/xiaofengzai/p/16712330.html

相关文章

  • python语法糖记录
    reduce对可迭代对象进行累积操作https://www.runoob.com/python/python-func-reduce.html注意:Python3.xreduce()已经被移到functools模块里,如果我们要使用,需要引入......
  • STATA数据统计软件学习记录
    STATA是一个数据统计软件,正如它的名字一样,STATA=statistic+data。STATA软件的功能和matlab类似,也可以用代码实现数据的统计与可视化。但几乎只能进行整行整列的数据处......
  • 2022暑假吃饭记录
    只包括在校的午饭和晚饭。7.4星期一:{\(\,\,\,\,\,\,\,\,\)午饭:cBr凉面+饭团。\(\,\,\,\,\,\,\,\,\)晚饭:方便面杨掌柜粉面菜蛋红色。}7.5星期二:{\(\,\,\,\,\,\,\,......
  • 记录--通过手写,分析Promise核心原理
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助1.定义整体结构先写出构造函数,将Promise向外暴露/*自定义Promise函数模块:IIFE*/(function(win......
  • LeetCode 做题 简单【 删除排序链表中的重复元素】 链表
    【删除排序链表中的重复元素】给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例1:输入:head=[1,1,2]输......
  • 9.21课上问题与思考
    在本周的Java课上我获得了以下的思考与感受一、懒人造就了方法对于相同的开山一事,愚公和李冰有不同的方式去处理。愚公选择一点点去凿山,靠日积月累的努力去完成目标,李冰......
  • 禅道简单记录
    环境:禅道旗舰版3.6.1 错误警告:数据太多,请在php.ini中修改max_input_vars(大于100000的数)。保存并重新启动apache或php-fpm,否则会造成部分数据无法保存。解决......
  • LeetCode组合总和
    组合总和前言在上篇文章通过组合问题看透回溯法当中我们通过介绍一个组合问题,仔细地分析了组合问题的回溯过程。我们之后会继续介绍一些比较经典的回溯算法题,帮助深入彻......
  • 【学习随笔】2022.9.21
     ①左扰动与右扰动的添加规则:          #参考链接①为什么要使用齐次坐标②三维空间刚体的旋转③李群与李代数浅讲......
  • 记录nodejs中querystring‘已弃用’三种处理方法
    一.升级node版本,修改引入方式//升级到18.x版本后修改引入方式constquerystring=require('node:querystring')二.官方推荐URLSearchParams替代因为不想升级就按照......