剑指offer刷题笔记--Num41-50

1--数据流中的中位数(41)

 主要思路:

      维护两个优先队列,Q1大数优先,存储比中位数小的数;Q2小数优先,存储比中位数大的数;

       当存储的数为偶数时,Q1.size() == Q2.size(), 中位数为:(Q1.top() + Q2.top()) / 2.0

       当存储的数为奇数时,Q2.size() = Q1.size() + 1, 中位数为 Q2 的队头元素

       因此插入元素,要确保Q2.size() >= Q1.size();

       同时插入新元素时,要先插入到另一个队列中,确保有序,取队头元素再插入到目的元素中;

#include <iostream>
#include <queue>   
#include <algorithm>class MedianFinder {
public:MedianFinder() {}void addNum(int num) {// Q1大数优先,存储比中位数小的数// Q2小数优先,存储比中位数大的数// 当存储的数为偶数时,Q1.size() == Q2.size(), 中位数为:(Q1.top() + Q2.top()) / 2.0// 当存储的数为奇数时,Q2.size() = Q1.size() + 1, 中位数为 Q2 的队头元素// 因此插入元素,要确保Q2.size() >= Q1.size(); // 同时插入新元素时,要先插入到另一个队列中,确保有序,取队头元素再插入到目的元素中if(Q1.size() == Q2.size()){Q1.push(num);int top = Q1.top();Q1.pop();Q2.push(top);}else{Q2.push(num);int top = Q2.top();Q2.pop();Q1.push(top);}}double findMedian() {if(Q1.size() == Q2.size()){return (Q1.top() + Q2.top()) / 2.0;}else{return Q2.top()*1.0;}}
private:std::priority_queue<int, std::vector<int>, std::less<int>> Q1; // 大数优先级高,队头std::priority_queue<int, std::vector<int>, std::greater<int>> Q2; // 小数优先级高,队头
};int main(int argc, char *argv[]){MedianFinder S1;S1.addNum(1);S1.addNum(4);S1.addNum(2);S1.addNum(3);double Res = S1.findMedian();std::cout << Res << std::endl;return 0;
}

2--连续子数组的最大和(42)

主要思路:

        使用动态规划解决: 

#include <iostream>
#include <vector>class Solution {
public:int maxSubArray(std::vector<int>& nums) {int len = nums.size();if(len == 0) return 0;std::vector<int> dp;dp.push_back(nums[0]);int max = nums[0];for(int i = 1; i < len; i++){if(dp[i - 1] >= 0){dp.push_back(dp[i-1] + nums[i]);}else{dp.push_back(nums[i]);}if (dp[i] > max) max = dp[i];}return max;}
};int main(int argc, char *argv[]){Solution S1;std::vector<int> test = {-2, 1, -3, 4, -1, 2, 1, -5, 4};int Res = S1.maxSubArray(test);std::cout << Res << std::endl;return 0;
}

3--1~n中整数中 1 出现的次数(43)

主要思路:视频讲解和题解

        规律题,当固定住其中 1 位时,计算其出现1的次数,分别统计个位、百位、千位等数字出现1的个数并求和相加即可;

#include <iostream>
#include <vector>class Solution {
public:int countDigitOne(int n) {long long bit = 1;long long sum = 0;while(bit <= n){long long cur = n / bit % 10;long long low = n % bit;long long high = n / bit / 10;if(cur == 0){sum += high * bit;}else if(cur == 1){sum += high*bit + low + 1;}else{sum += (high+1)*bit;}bit = bit*10;}return (int)sum;}
};int main(int argc, char *argv[]){Solution S1;int test = 12;int sum = S1.countDigitOne(test);std::cout << sum << std::endl;return 0;
}

4--数字序列中某一位的数字(44)

主要思路:视频讲解

        规律题,先判断 n 属于哪个范围的数(个位、百位、千位等),再计算 n 具体属于哪一个数,最后计算 n 属于某一个数的具体哪一位,返回即可;

#include <iostream>
#include <vector>
#include <cmath>class Solution {
public:int findNthDigit(int n) {if(n == 0) return 0;long bit = 1; // 1 10 100int i = 1; // 1 2 3long count = 9; // 9 180 2700 // 范围内字符的个数 // 确定属于哪一个范围while(count < n){n = n - count;i = i + 1;bit = bit * 10;count = bit * i * 9;}// 确定属于哪一个数long num = bit + (n-1) / i;// 确定具体哪一位int index = (n - 1) % i + 1;int res = (int)(num / pow(10, i - index)) % 10;return res;}
};int main(int argc, char *argv[]){Solution S1;int test = 19;int res = S1.findNthDigit(test);std::cout << res << std::endl;return 0;
}

5--把数组排成最小的数(45)

主要思路:

        拼接字符串 x+y > y+x, 则 x>y;

        拼接字符串 x+y < y+x, 则 x<y;

         使用快排对字符串数组进行排序,要确保由字符串数组组成的数最小,即strs[0]strs[1]strs[2]...最小,必须连续满足strs[0] < strs[1], strs[1] < strs[2];

#include <iostream>
#include <vector>
#include <string>class Solution {
public:std::string minNumber(std::vector<int>& nums) {std::string Res;if (nums.size() == 0) return Res; std::vector<std::string> strs;// 数字 -> stringfor(int item : nums){strs.push_back(std::to_string(item));}quickSort(strs, 0, nums.size()-1);for(std::string str : strs){Res.append(str);}return Res;}void quickSort(std::vector<std::string>& strs, int left, int right){if (left >= right) return;std::string pivot = strs[left];int i = left, j = right;while(i < j){while(i < j && strs[j] + pivot >= pivot + strs[j]) j--; // 拼接字符串 x+y > y+x, 则 x>ystrs[i] = strs[j];while(i < j && strs[i] + pivot <= pivot + strs[i]) i++; // 拼接字符串 x+y < y+x, 则 x<ystrs[j] = strs[i]; }strs[i] = pivot;quickSort(strs, left, i-1);quickSort(strs, i+1, right);}
};int main(int argc, char *argv[]){Solution S1;std::vector<int> test = {3, 30, 34, 5, 9};std::string Res = S1.minNumber(test);std::cout << Res << std::endl;return 0;
}

6--把数字翻译成字符串(46)

主要思路:

        基于动态规划定义状态和转移方程:dp[i] 代表以 x_i​ 为结尾的数字的翻译方案数量;

#include <iostream>class Solution {
public:int translateNum(int num) {if(num < 10) return 1;int dp_1 = 1;int dp_2 = 1;int dp;while(num != 0){int tmp = ((num/10) % 10) * 10 + (num % 10);if(9 < tmp && tmp < 26){dp = dp_1 + dp_2;}else{dp = dp_1;}dp_2 = dp_1;dp_1 = dp;num = num / 10;}return dp;}
};int main(int argc, char *argv[]){Solution S1;int num = 12258;int Res = S1.translateNum(num);std::cout << Res << std::endl;return 0;
}

7--礼物的最大价值(47)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决github无法拉取submodule子模块的问题

引言 当使用git clone --recursive url 拉取一个配置了子模块的仓库后&#xff0c;会卡住。 同时在使用git clone 拉去https的url时&#xff0c;同样可能会出现一直卡在cloning int reposity...本文提供一个简单的脚本来解决该问题。 前置准备 需要配置好git的相关配置&…

快速配置 Rust 开发环境并编写一个小应用

安装: curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh 更新: Rust 的升级非常频繁. 如果安装 Rustup 后已有一段时间,那么很可能 Rust 版本已经过时, 运行 rustup update 获取最新版本的 Rust rustc&#xff1a;编译Rust程序 rustc只适合简单的Rust程序&#xf…

qt和vue的交互

1、首先在vue项目中引入qwebchannel /******************************************************************************** Copyright (C) 2016 The Qt Company Ltd.** Copyright (C) 2016 Klarlvdalens Datakonsult AB, a KDAB Group company, infokdab.com, author Milian …

记录--再也不用手动改package.json的版本号

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 本文的起因是有在代码仓库发包后&#xff0c;同事问我“为什么package.json 里的版本还是原来的&#xff0c;有没有更新&#xff1f;”&#xff0c;这个时候我意识到&#xff0c;我们完全没有必要在每…

阿里云无影云电脑具体价格_云桌面不同配置1元报价

阿里云无影云电脑配置费用&#xff0c;4核8G企业办公型云电脑可以免费使用3个月&#xff0c;无影云电脑地域不同费用不同&#xff0c;无影云电脑是由云桌面配置、云盘、互联网访问带宽、AD Connector、桌面组共用桌面session等费用组成&#xff0c;阿里云百科分享阿里云无影云电…

什么是分布式软件系统

:什么是分布式软件系统&#xff1f;分布式软件系统是什么意思&#xff1f; 分布式软件系统(Distributed Software Systems)是支持分布式处理的软件系统,是在由通信网络互联的多处理机体系结构上执行任务的系统。它包括分布式操作系统、分布式程序设计语言及其编译(解释)系统、分…

Unity 2D骨骼动画+IK反向动力学

本文言简意赅的完成这个流程&#xff0c;废话不多说&#xff01;干&#xff01; 等等&#xff0c;先看看效果 第一步&#xff1a;导入2D Animation包 当前环境&#xff1a;Unity3D 2021(不需要完全一样也可以) 进入unity后点击Window->PackageManager打开如下界面 按Insta…

LangChain 联合创始人下场揭秘:如何用 LangChain 和向量数据库搞定语义搜索?

近期&#xff0c;关于 ChatGPT 的访问量有所下降的消息引发激烈讨论&#xff0c;不过这并不意味着开发者对于 AIGC 的热情有所减弱&#xff0c;例如素有【2023 最潮大语言模型 Web 开发框架】之称的大网红 LangChain 的热度就只增不减。 原因在于 LangChain 作为大模型能力“B2…

Vue3_简介、CompositionVPI、新的组件

文章目录 Vue3快速上手1.Vue3简介2.Vue3带来了什么1.性能的提升2.源码的升级3.拥抱TypeScript4.新的特性 一、创建Vue3.0工程1.使用 vue-cli 创建2.使用 vite 创建 二、常用 Composition API1.拉开序幕的setup2.ref函数3.reactive函数4.Vue3.0中的响应式原理vue2.x的响应式Vue3…

万字长文 | Hadoop 上云: 存算分离架构设计与迁移实践

一面数据原有的技术架构是在线下机房中使用 CDH 构建的大数据集群。自公司成立以来&#xff0c;每年都保持着高速增长&#xff0c;业务的增长带来了数据量的剧增。 在过去几年中&#xff0c;我们按照每 1 到 2 年的规划扩容硬件&#xff0c;但往往在半年之后就不得不再次扩容。…

《Redis 核心技术与实战》课程学习笔记(八)

String 类型为什么不好用了&#xff1f; String 类型可以保存二进制字节流&#xff0c;只要把数据转成二进制字节数组&#xff0c;就可以保存了。String 类型并不是适用于所有场合的&#xff0c;它有一个明显的短板&#xff0c;就是它保存数据时所消耗的内存空间较多。 为什么…

Unity Shader - SV_POSITION 和 TEXCOORD[N] 的varying 在 fragment shader 中输出的区别

起因 因另一个TA同学问了一个问题 我抱着怀疑的心态&#xff0c;测试了一下 发现 varying 中的 sv_position 和 texcoord 的值再 fragment shader 阶段还真的不一样 而且 sv_position 还不是简单的 clipPos/clipPos.w 的操作 因此我自己做了一个试验&#xff1a; 结果还是不一…

电脑应用程序发生异常怎么办?

有时候我们打开电脑上面的某个软件时&#xff0c;会打不开&#xff0c;并且会弹出如下的错误提示“应用程序发生异常 未知的软件异常&#xff08;&#xff58;&#xff58;&#xff58;&#xff09;&#xff0c;位置为&#xff58;&#xff58;”。相信大多数的人在使用电脑的时…

Pytorch基本使用—激活函数

✨1 介绍 ⛄ 1.1 概念 激活函数是神经网络中的一种数学函数&#xff0c;它被应用于神经元的输出&#xff0c;以决定神经元是否应该被激活并传递信号给下一层。常见的激活函数包括Sigmoid函数、ReLU函数、Tanh函数等。 &#x1f384; 1.2 性质 激活函数是神经网络中的一种重…

为什么单片机可以直接烧录程序的原因是什么?

单片机&#xff08;Microcontroller&#xff09;可以直接烧录程序的原因主要有以下几点&#xff1a; 集成性&#xff1a;单片机是一种高度集成的芯片&#xff0c;内部包含了处理器核心&#xff08;CPU&#xff09;、存储器&#xff08;如闪存、EEPROM、RAM等&#xff09;、输入…

校园wifi网页认证登录入口

很多校园wifi网页认证登录入口是1.1.1.1 连上校园网在浏览器写上http://1.1.1.1就进入了校园网 使 用 说 明 一、帐户余额 < 0.00元时&#xff0c;帐号被禁用&#xff0c;需追加网费。 二、在计算中心机房上机的用户&#xff0c;登录时请选择新建帐号时给您指定的NT域&…

windows 搭建ssh服务

1、官网下载安装包&#xff1a;mls-software.com 2、点击安装&#xff08;一直默认即可&#xff09; 3、配置 opensshServer 4、成功登录

Python深度强化学习实战 ——OpenAI Gym-CarRacing自动驾驶项目

&#x1f4ad; 写在前面&#xff1a;本篇是关于 OpenAI Gym-CarRacing 自动驾驶项目的博客&#xff0c;面向掌握 Python 并有一定的深度强化学习基础的读者。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行的 Box2D 物理引擎的一个…

灌区信息化智能测控一体化闸门系统解决方案

一、方案背景 闸门是节水灌溉工程中重要组成部分。在农田灌区中&#xff0c;一方面存在传统手摇闸门&#xff0c;未能实现自动化、数字化&#xff0c;另一方面部分灌区闸站虽然部分实现了自动化控制&#xff0c;但是由于闸站较多&#xff0c;有些位置较为偏僻&#xff0c;部分水…

Jmeter接口关联(一)【使用json层级方式提取值】与python中使用层级方式提取值 完成接口关联

文章目录 前言一、按照 json 的路径来提取 ​​​​​​​&#xff08;1&#xff09;成功匹配到数据的案例&#xff08;按照层级匹配&#xff09;&#xff08;2&#xff09;失败未匹配到数据的案例&#xff08;没有按照层级匹配&#xff09;json提取器二、使用完整的接口关联&a…