自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 3.1.贪心算法导论——为什么“局部最优“能推出“全局最优“?

贪心算法摘要 贪心算法是一种通过局部最优选择逐步构建全局最优解的算法范式。其核心思想是:每一步都采取当前状态下最优的选择,而不考虑后续决策的影响。 关键特性 局部最优性:每一步选择当前最优解 不可回溯:决策后不重新考虑之前的选择 高效性:通常时间复杂度优于动态规划 适用条件 贪心选择性质:局部最优能导向全局最优 最优子结构:问题的最优解包含子问题的最优解 典型应用场景 活动选择问题(最早结束优先) 找零钱问题(特定面值) 任务调度问题 区间合并问题 证明方法 交换论证:证明任何最优解都可以通过交换调整为贪心

2026-04-06 20:47:46 312

原创 2.8.计数排序——不比大小,先统计再还原为什么能线性完成?

计数排序是一种非比较排序算法,通过统计元素出现次数实现线性时间复杂度。它适用于整数数据且值域范围较小的情况。算法步骤如下:1)统计元素频次;2)根据频次还原有序序列。稳定版本通过前缀和和逆序回填保持相同元素的原始顺序。时间复杂度为O(n+k),空间复杂度O(k),其中n为元素个数,k为值域范围。计数排序是桶排序和基数排序的基础,特别适合小值域整数排序。典型应用如LeetCode 75题颜色分类问题。

2026-04-04 21:26:53 377

原创 2.7.希尔排序——让插入排序先大步走,再小步收尾

希尔排序是插入排序的优化版本,通过先进行大跨度的元素调整,再逐步缩小间隔,最终用插入排序收尾。这种方法能显著减少小元素远距离移动的次数,提高排序效率。其时间复杂度取决于步长序列的选择,通常在O(n log n)到O(n²)之间。虽然希尔排序不稳定且复杂度不如快速排序等算法优秀,但实现简单且在小数据量下表现良好,适合作为插入排序的优化替代方案。

2026-04-04 21:14:08 405

原创 2.6.堆排序——从堆结构到 Top-K,一套思路贯穿排序与选择

摘要 堆排序是一种基于二叉堆结构的排序算法,时间复杂度稳定为O(n log n)。它分为两个阶段:首先将无序数组构建为大顶堆,然后反复将堆顶最大值与末尾元素交换并下沉调整。堆排序不仅能高效排序,还可解决Top-K选择问题,其核心在于维护堆结构的不变性——每个节点不小于其子节点。算法从最后一个非叶子节点开始自底向上建堆,再通过反复交换堆顶元素并下沉实现排序。堆排序的优势在于统一了排序与选择问题的解决思路,适用于需要动态获取最值的场景。相比快排和归并排序,堆排序在空间复杂度(O(1))和稳定性(不稳定)方面具有

2026-04-03 15:28:57 444

原创 2.5.归并排序——分而治之再合而并,为什么它能稳定保持 O(n log n)?

归并排序是一种基于分治思想的稳定排序算法,其核心思想是将数组不断拆分为子数组直至长度为1(天然有序),然后通过合并两个有序子数组实现排序。该算法的时间复杂度稳定为O(n log n),因为每次递归分解问题规模减半(log n层),而每层合并操作耗时O(n)。归并排序的优势在于稳定性、可靠的最坏情况性能,特别适合链表排序和逆序对统计等场景。相比快速排序,它不受数据分布影响;相比堆排序,它能保持稳定性。实现时需注意递归拆分和有序合并两个关键步骤。

2026-04-03 09:46:51 631

原创 2.4.快速排序——先分区再递归,为什么它平均这么快却可能退化?

快速排序是一种高效的分治排序算法,通过选取基准值将数组分为左右两部分(左边≤基准,右边≥基准),然后递归处理子数组。其平均时间复杂度为O(n log n),但在最坏情况下(如数组已有序)会退化到O(n²)。随机化选择基准值能有效避免退化,提高实际性能。快速排序的优势在于原地排序和良好的缓存局部性,使其成为实践中常用排序算法。代码实现包括分区和递归两个核心步骤,通过边界指针i和扫描指针j完成元素交换,最终确定基准位置。

2026-04-02 16:53:41 888

原创 2.3.插入排序——像打牌一样整理数组,为什么它对“几乎有序”数据特别友好?

插入排序是一种基础排序算法,通过将每个元素插入到前面已排序部分的正确位置来工作。其时间复杂度在最坏情况下为O(n²),但对近乎有序的数据只需O(n)。算法稳定且原地操作,适合小规模数据。插入排序的优势在于能高效处理部分有序数组,实际工程中常被用作其他排序算法的小区间优化策略。

2026-04-02 12:49:00 559

原创 2.2.选择排序——每轮找最小,为什么交换更少却反而不稳定?

选择排序核心思想与特点 选择排序通过逐轮扫描未排序区间找到最小值并交换到前面,每轮确定一个元素的最终位置。其特点是: 时间复杂度固定为O(n²),比较次数不受数据初始顺序影响 交换次数少(O(n)),但比较次数多 不稳定排序,交换可能破坏相等元素的相对顺序 难以优化,必须完整扫描才能确认最小值 空间复杂度O(1),属于原地排序 典型应用场景是对交换成本高、比较成本低的数据进行排序。虽然效率不高,但思路简单直观,适合教学和小规模数据排序。

2026-04-01 23:08:33 374

原创 2.1.冒泡排序——从入门到面试,彻底搞懂这道“最简单“的题

本文全面解析冒泡排序算法,从基础原理到优化进阶。冒泡排序通过相邻元素比较交换,使较大元素逐步"上浮"至正确位置。文章详细演示了排序过程,分析了时间复杂度(最好O(n),最坏O(n²))和稳定性(稳定)。提供了Python和C++实现代码,并介绍三种优化方法:提前终止、记录交换位置和双向冒泡(鸡尾酒排序)。作为基础排序算法,冒泡排序虽然效率不高,但能帮助理解排序本质和算法优化思路。

2026-04-01 22:58:44 458

原创 Android Studio 配置 Flutter —— 踩坑合集

Android Studio 配置 Flutter

2026-01-28 23:49:27 721

原创 Visual Studio 2017 MFC控件 - Edit Control输入框

Visual Studio 2017 MFC控件 - Edit Control输入框

2024-10-24 16:49:21 1749

原创 Visual Studio 2017 MFC控件 - Button按钮

Visual Studio 2017 MFC控件 - Button按钮

2024-10-16 17:00:56 3415

原创 Visual Studio 2017安装MFC相关组件并新建MFC初始化项目

介绍了如何对VS添加MFC所必须的组件,以及简单的新建一个MFC样例并运行。

2024-10-12 14:37:30 2086 2

原创 Codeforces Round #697 (Div. 3)

Codeforces Round #697 (Div. 3)传送门(点击传送)A. Odd Divisor题意:  问给出的数字是否含有一个为奇数的约数( t 组数据)。  思路:  如果一个数含有为奇数的约数,那么这个数把所有的因子 2 除取之后一定不得 1 。  代码:#include<bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(false); cin.tie(

2021-01-26 01:11:36 315 1

原创 Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2)

Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2)传送门(点击传送)A. Prison Break题意:  有一个 n×mn × mn×m 大小的监狱,每一个坐标 (i,j)(i, j)(i,j) 的位置都是一个牢房单间,现在位于 (r,c)(r,c)(r,c) 的位置有一个密道,现在每个人每秒钟只能移动到相邻的牢房单间,问整座监狱的所有犯人都移动到有密道的牢房单间需要多长时间。  思路:  

2020-12-05 22:11:42 226

原创 树状数组的另一种讲解

树状数组的讲解最近为了给女朋友讲明白树状数组,就再次接触了这个让人比较头疼的数据结构,之前看了网上其它的树状数组的教程,感觉看完能够会用,但并不是能够比较好的理解。因为先接触的线段树,而且线段树从操作还是意义来说都会更加直观易懂一些,所以我个人从线段树的角度出发,找到了一个自己比较容易理解的方向来描述了树状数组。1.树状数组的元素首先,我们先考虑这么一棵满二叉树形式的表示区间和的线段树,每个节点表示的范围我已经标了出来:相信对于上面这棵满二叉树,我们在了解线段树之后并不陌生,而且线段树对应的相关操

2020-11-29 00:23:52 221

原创 Codeforces Round #686 (Div. 3)

Codeforces Round #686 (Div. 3)传送门(点击传送)之后会补全,坑位占上先写点想写的东西B. Unique Bid Auction题意:思路:代码:#include<bits/stdc++.h>using namespace std;struct node{ int num,loc;}person[200005];int main(){ ios::sync_with_stdio(false); cin.tie(0);cou

2020-11-28 21:24:46 210

原创 Codeforces Round #685 (Div. 2)

Codeforces Round #685 (Div. 2)传送门(点击传送)之后会补全题意和思路A. Subtract or Divide题意:思路:代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int t,n,ans; ci

2020-11-28 21:21:24 150

原创 Educational Codeforces Round 98 (Rated for Div. 2)

Educational Codeforces Round 98 (Rated for Div. 2)传送门(点击传送)之后会补全题意和思路A. Robot Program题意:  有一个机器人在(0,0)位置,你可向上、向下、向左、向右移动一个单位,也可以待在原地,不能连着两次向同一个方向移动,问从(0,0)到(x,y)需要多少步。( t 组数据)思路:  分为两个步骤,第一个步骤先从(0,0)移动到(min(x,y),min(x,y)),然后第二个步骤再朝着(x,y)曲折前进,通过调整第一个

2020-11-28 21:15:58 137

原创 Codeforces Round #684 (Div. 2)

Codeforces Round #684 (Div. 2)传送门(点击传送)A. Buy the String题意:  有长度为n的二进制串,你可以花费h的价格把任意一位置反( 1 改 0 ,0 改 1 )。然后你要买下这个二进制串,每个 1 你需要花费 c1c_1c1​ 元,每个 0 你需要花费 c0c_0c0​ 元。问最少需要多少钱可以买下二进制串。( t 组数据)  思路:  枚举整个串有 0 个 0 到有 n 个 0 ,其中的最小值即为答案。  代码:#include<b

2020-11-18 14:56:26 229

原创 Codeforces Round #683 (Div. 2, by Meet IT)

Codeforces Round #683 (Div. 2, by Meet IT)传送门(点击传送)A. Add Candies题意:  有 m 个包,第 i 个包初始有 i 个糖果,现在可以进行如下操作,当你进行第 j 次操作时,选择一个包 x ,除第 x 个包外每个包增加 j 个糖果,现在让你将每个包的糖果数量操作到相等,请输出你的操作次数以及依次输出每次选择的包。( t 组数据)思路:  想法当然是让越靠前的包增加的越多,而且因为是等差数列差一,而且增加也是每次多一个,所以从 1 到 n

2020-11-16 23:15:16 180

原创 Codeforces Round #682 (Div. 2)

Codeforces Round #682 (Div. 2)传送门(点击传送)A. Specific Tastes of Andre题意:  定义如果一个数组如果这个数组的所有元素之和可以整除这个数组的元素个数,那么称这个数组为好数组,现在给出数组元素个数 n ,请构造这个数组,每个元素不小于 1 且不大于 100。( t 组数据)思路:  直接构造所有元素都是 1 即可。代码:#include<bits/stdc++.h>using namespace std;int ma

2020-11-14 11:12:36 298

原创 Kotlin Heroes 5: ICPC Round —— Codeforces Contest

Kotlin Heroes 5: ICPC Round传送门(点击传送)先把代码贴上了,题意思路以后补。A. Selling Hamburgers题意:思路:代码:import java.util.Scannerfun max(a:Long, b:Long) : Long{ var ans:Long = 0 if(a > b) ans = a else ans = b return ans}fun main() { val reader =

2020-11-13 21:08:21 535

原创 Kotlin Heroes 5: ICPC Round (Practice) —— Codeforces Contests

Kotlin Heroes 5: ICPC Round (Practice)传送门(点击传送)注:这场练习赛整场只允许用 Kotlin 作为唯一语言。所以现学的,有语法不规范或者错误的地方欢迎教导和指正。A. A+B (Trial Problem)题意+思路:  单纯的A+B。( t 组数据)代码:import java.util.Scannerfun main(args: Array<String>) { val reader = Scanner(System.`

2020-11-10 00:12:57 820

原创 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)传送门(点击传送)题意:思路:代码:题意:思路:代码:题意:思路:代码:题意:思路:代码:

2020-11-03 00:39:51 2785 4

原创 Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)

Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)传送门(点击传送)A. Array Rearrangment题意:  给出了两个序列 a 和 b ,每个序列都有 n 个数字,现在问能否通过排列,使得对于每个位置 i 都有ai+bi⩽xa_{i}+b_{i} \leqslant xai​+bi​⩽x,如果可以则输出YES,不可以则输出NO。  思路:  将两个序列一个从大到小排列,另一个从小到大排列,判断对于每个位置 i

2020-11-01 22:14:22 358

原创 如何在Linux下使用QEMU运行一个RISC-V架构的Linux(busybox篇)

如何在Linux下并在QEMU中运行一个RISC-V架构的Linux文章目录如何在Linux下并在QEMU中运行一个RISC-V架构的Linux前言一、Linux系统1.VMware的安装2.Linux的安装二、使用步骤1.引入库2.读入数据总结前言     这是我在大学期间尝试去搭建的一个环境,因为大学期间看了《自己动手写CPU》这本书,照着上面写了一个MIPS架构的CPU,后来在老师的要求下又尝试去github上学习了解和并写了RISC-V架构的CPU,不

2020-10-31 14:16:02 6264 4

原创 Educational Codeforces Round 97 (Rated for Div. 2)

Educational Codeforces Round 97 (Rated for Div. 2)传送门(点击传送)A. Marketing Scheme题意:  顾客要买 x 件商品,现在商品每 a 件为一套包装,顾客的策略为先买⌊xa⌋\left \lfloor \frac{x}{a} \right \rfloor⌊ax​⌋个整包装,再买剩余的 x mod a 个单品,如果 x mod a 的数量大于等于a2\frac{a}{2}2a​(即 x%a⩾a2x\%a\geqslant\frac{a

2020-10-28 21:07:53 523

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除