![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题 算法
文章平均质量分 72
友人苏
一位让普通到不能在普通以至于让普通都惭愧的叫声爸爸的普通acmer,想通过竞赛,考研,让自己不至于让普通都叫声爸爸的普通学生
展开
-
2021-06-19 LeetCode—石子游戏
LeetCode—石子游戏提示:2 <= piles.length <= 500piles.length 是偶数。1 <= piles[i] <= 500sum(piles) 是奇数。解题思路此处撰写解题思路首先理清题目要求:1.亚历克斯先取石头2.每回合玩家只能从开始或结束处取走整堆石头3.两位玩家都发挥最佳水平(意思就是每个人选取时,都是选取当前首尾两处石子数更多的)代码思路:题目给了首指针(piles)和石子的堆数,那我们可以定义一个尾指针(pta原创 2021-06-19 17:12:46 · 218 阅读 · 1 评论 -
LeetCode 杨辉三角
杨辉三角是一个比较经典的动态规划,它的状态方程也很简单,当j == 0 || i== j时,dp[ i ][ j ] = 1,其他情况则是 dp[i][j] = dp[i - 1][j -1] + dp[i - 1][ j ]。代码如下:int** generate(int numRows, int* returnSize, int** returnColumnSizes){ //用malloc申请一块连续的空间,该空间内的元素都是指针类型,所以ret因定义为一个二级指针 int** ret.原创 2021-10-25 22:10:38 · 241 阅读 · 0 评论 -
[题解]《算法零基础100讲》(第1讲) 幂和对数
文章目录一. 概念定义1.1 幂1.2 对数二. 相关练习2.1 2的幂2.2 3的幂2.3 4的幂一. 概念定义1.1 幂 幂是指数运算的结果,计算m ^ n,也就是n个m相乘,在C语言中,我们通常使用循环来进行幂的计算,但这种计算方式太慢了,这里我们学习一个更快的方法——二分快速幂。二分快速幂 二分快速幂的主要思想就是“分而治之”,其通常的表达式为:通过这个公式我们很容易想到,需要通过递归的方式实现代码如下:int quickMul(int a, int m){ if(原创 2021-12-08 11:38:57 · 417 阅读 · 3 评论 -
《算法零基础100讲》(第5讲) 计数法(c语言解题)
今日题解1748. Sum of Unique Elements1748.唯一元素和 Constraints:1 <= nums.length <= 1001 <= nums[i] <= 100这道题是一道十分基础的计数题,并且数据范围也比较小,可以利用数组下标来记录每个数出现的次数。代码如下:int sumOfUnique(int* nums, int numsSize){ //元素大小在1-100,所以我们定义一个长度为101的数组 int arr[原创 2021-10-26 14:36:22 · 607 阅读 · 8 评论 -
《算法零基础100讲》(第6讲) 日期算法
今日题解1185. 一周中的第几天1154. 一年中的第几天1360. 日期之间隔几天1185. 一周中的第几天Constraints:The given dates are valid dates between the years 1971 and 2100.分析:题目给定的年份范围是[1971,2100],然后我们可以根据力扣的数据测试得出1971年1月1日是Friday,当然不嫌麻烦的话也可以去查日历。既然知道初始条件,那目前最简单暴力的方法就是直接计算他们相差有多少天。因为一周的原创 2021-10-27 10:08:38 · 306 阅读 · 0 评论 -
《算法零基础100讲》(第7讲) 素数判定(题解)
今日题解866. 回文素数剑指 Offer 49. 丑数866. 回文素数对于这道题,我们可以先将它拆分为两部分,回文和素数。一. 首先我们先判断回文数,回文数的意思就是一个数的正向和反向的数字是一样的,例如:121,1221,12321等。得到一个数的反向我们只需要通过 % 和 / 两个操作符,不断辗转,最后得到。但是这种将一个整数整个反转的方法有点费时,毕竟我们只需判断,不需要计算。通过分析我们很容易可以看出,每个回文数都有一个对称轴可以将其对半划分,并且两边时一样得,所以我们可以反转原创 2021-10-28 17:11:35 · 429 阅读 · 5 评论 -
《算法零基础100讲》(第8讲) 素数筛选(C语言解题)
204.计算质数 质数在之前的篇章中我们也进行过一个初步的了解,质数的定义是:只包含1和本身为因子的数就叫做质数,质数又称为素数。例如2,3,5,7,11等,他们的因子都只有两个,那就是1和他们本身。 今天这道题我们是要计算出小于n的质数有多少个,大多数人第一想法就是遍历,当然这也是最直接,最方便的解法,思维方式也不算复杂,只需在区间[2,√n]中查询是否还有能够整除n的数,有则返回true,否则返回false。代码如下:bool isPrime(int n) {原创 2021-10-29 09:10:00 · 210 阅读 · 0 评论 -
《算法零基础100讲》(第9讲) 算术基本定理(C语言题解)
算数基本定理507.完美数263. 丑数507.完美数这道题十分简单,我觉得也没必要说太多,我们只需在[1, √n]这个区间内找出他的所有因子,并加起来,最后判断是否与n相等。直接上代码:bool checkPerfectNumber(int num){ if(num == 1){ return false; } int sum = 0; for(int i = 1; i * i <= num; i++){ //判断是否是因子原创 2021-10-29 10:22:10 · 604 阅读 · 1 评论 -
《算法零基础100讲》(第10讲) 因子分解和枚举(C语言题解)
今日题解1492. n 的第 k 个因子1362.最接近的因数1492. n 的第 k 个因子说句实话,这道题好水呀,这种难度的题也被放在中等难度。直接遍历,时间复杂度为O(n),遍历区间为[1,n],如果n % i == 0,k–,直到k==0,返回i,如果遍历结束,还未找到第k个因子,return -1。直接上代码:int kthFactor(int n, int k){ for(int i = 1; i <= n; i++){ //判断是否为因子 if(n原创 2021-10-30 17:01:24 · 162 阅读 · 0 评论 -
[解题报告]《算法零基础100讲》(第11讲) 因子数
The number of divisors(约数) about Humble Numbers分析:这道题其实是叫我们求一个数的质因数2, 3, 5, 7的个数,所以我们可以根据公式,求出每个因子数量,然后进行乘积。公式如下:代码:#include <iostream>using namespace std;int main(){ long long n = 1; int arr[] = { 2, 3, 5, 7 }; while (cin >原创 2021-10-31 21:53:04 · 151 阅读 · 0 评论 -
[今日题解]《算法零基础100讲》(第12讲) 因子和
1390. 四因数对于这到题我们首先要了解一个定理——约数和定理约数和定理: 对于一个大于1正整数n可以分解质因数:n=p1a1*p2a2*p3a3*…*pkak,则由约数个数定理可知n的正约数有(a₁+1)(a₂+1)(a₃+1)…(ak+1)个,那么n的(a₁+1)(a₂+1)(a₃+1)…(ak+1)个正约数的和为:f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)但是这道题是让我们找因原创 2021-11-01 21:56:29 · 139 阅读 · 0 评论 -
[题解]《算法零基础100讲》(第13讲) 最大公约数
1979. 找出数组的最大公约数分析:首先遍历数组nums,找到max和min求gcd(max, min)然后如何实现函数gcd呢,实现gcd有两种办法。遍历出min约数,并判断该数是否能整除max,从而找出最大的公约数。代码:int gcd(int max, int min){ int ret = 0; for(int i = 1; i <= min; i++){ if(min % i == 0 && max % i == 0){ ret = i原创 2021-11-02 10:46:42 · 232 阅读 · 0 评论 -
[题解]《算法零基础100讲》(第14讲)最小公倍数
1819. 序列中不同最大公约数的数目这道题是真的难。正常人能够想到的可能就是列举所以子序列,并对每个子序列找出其应有的最大公约数,这个想法先不说时间复杂度,光是列举所有子序列,如果没有库的支持也很难写出,所以暴力是不可能的。所以我们先来整理一下思路:对于每个数组,其数组内的每一个元素本身也算一个子序列,固每个不同的元素也算一个子序列的最大公约数我们可以定义一个bool类型的数组f[200001],用于标记nums所包含的数据,标记的同时找出最大值max,应为公约数的范围肯定实在[1,max原创 2021-11-03 18:29:36 · 251 阅读 · 0 评论 -
《算法零基础100讲》(第15讲) 二分快速幂[题解]
一.主要知识点二分快速幂 二分快速幂的主要思想就是“分而治之”,其通常的表达式为:通过这个公式我们很容易想到,需要通过递归的方式实现代码如下:int quickMul(int a, int m){ if(m == 0){ return 1; } int v = quickMul(a, m / 2); return m % 2 == 0 ? v * v : v * v * a;}其计算过程的体现方式与二进制转化十进制有些相似。举个例子:原创 2021-11-04 17:36:25 · 166 阅读 · 0 评论 -
[C语言题解]《算法零基础100讲》(第16讲) 变量交换算法
变量交换算法概念定义课后练习面试题 05.07. 配对交换概念定义 交换变量,就是把两个数据的变量进行一次交换。如:a = 1,b = 2,交换后a = 2,b = 1。对于交换的方法,可以看一下这篇博客变量交换课后练习面试题 05.07. 配对交换这道题较笨的思路就是先将其转化为二进制,然后进行奇偶位的交换,再将交换后的二进制数转化为十进制。代码如下:int Mypower(int x, int n){ if(n == 0){ return 1; }原创 2021-11-05 09:34:23 · 134 阅读 · 0 评论 -
《算法零基础100讲》(第17讲) 线性枚举(一) - 最值算法
文章目录一.概念定义两个数的最小值n个数的最小值课后习题485. 最大连续 1 的个数1464. 数组中两元素的最大乘积153. 寻找旋转排序数组中的最小值154. 寻找旋转排序数组中的最小值 II414. 第三大的数628. 三个数的最大乘积一.概念定义两个数的最小值 两个数的最小值可以用if语句判断,也可以用C语言的三元运算符。//if语句判断int max(int a, int b){ if(a < b) return b; return a;}//三元运算符int原创 2021-11-06 20:49:24 · 330 阅读 · 0 评论 -
[C语言题解]《算法零基础100讲》(第18讲) 线性枚举(二) - 统计法入门
文章目录一.知识讲解二.课后习题2.1 统计位数为偶数的数字2.2 有序数组中的单一元素2.3 调整数组顺序使奇数位于偶数前面2.4 找到数组的中间位置2.5 寻找数组的中心下标2.6 删除有序数组中的重复项2.7 可被 5 整除的二进制前缀2.8 被K整除的最小整数2.9 哪种连续子字符串更长一.知识讲解1.线性遍历:线性遍历就是通过循环,将一个数组的数据按线性的方式依次遍历例如:将一个数组内的数据全部打印一遍void line(int* nums, int* numsSize){ for(in原创 2021-11-07 20:08:16 · 407 阅读 · 2 评论 -
《算法零基础100讲》(第19讲) 进制转换(一) - 入门[C语言题解]
文章目录一.概念定义1.1何为进制2. 进制转化三. 课后习题3.1 二进制中1的个数3.2 各位相加3.3 二进制链表转整数3.4 K 进制表示下的各位数字总和3.5 统计最大组的数目一.概念定义1.1何为进制 在我们的日常生活中,使用的数字计算进制都是逢十进一,当一个数字满十的时候,就往更高位进一,而这种计算方式就是所谓的十进制。 当然我们还有很多其他的进制方式,目前常用的有二进制,十进制和十六进制。2. 进制转化对于进制的转化,我们用二进制与十进制之间的转化为例:11101转化为十进原创 2021-11-08 19:30:14 · 486 阅读 · 2 评论 -
《算法零基础100讲》(第20讲) 进制转换(二) - 进阶[C语言题解]
文章目录一. 知识普及1.1 atoi1.2 log1.3 pow1.4 floor二. 进阶题解168. Excel表列名称171. Excel 表列序号483. 最小好进制今天要写实验报告,解析的话等我缓一下在写,先上代码(@_@)一. 知识普及 既然是进阶,那肯定是要有一道困难得题目,既然是困难的题目,那肯定不简单,肯定要用到我们平时接触不到的知识。 为了更好的理解困难题目的代码,我们先将几个函数及其用法。1.1 atoi函数atoi是一个将数字字符串转化为数字的函数。atoi的头文原创 2021-11-09 21:27:47 · 192 阅读 · 0 评论 -
《算法零基础100讲》(第21讲) 字符串算法(一) - 字符串遍历[C语言题解]
文章目录一. 字符串1.1 基本概念1.2 计算字符串的长度1.3 遍历方式二. 课后习题2.1 判断国际象棋棋盘中一个格子的颜色2.2 速算机器人2.3 执行操作后的变量值2.4 长度为三且各字符不同的子字符串2.5 1704. 判断字符串的两半是否相似2.6 将所有数字用字符替换一. 字符串1.1 基本概念 字符串是由多个字符组成,例如:“ascds”,“aa”,“ccc”,这些都是字符串。在C语言中,字符串都是存放在字符数组里面。char str1[6] = "world";//(1)c原创 2021-11-10 11:45:29 · 1424 阅读 · 0 评论 -
[题解报告]《算法零基础100讲》(第22讲) 字符串算法(二) - 字符串比较
文章目录一. 推荐专栏二. 重点知识2.1 strcmp函数2.2 strstr函数三. 课后习题3.1 替换空格3.2 稀疏数组搜索3.3 单词规律3.4 解码字母到整数映射3.5 作为子字符串出现在单词中的字符串数目一. 推荐专栏推荐算法专栏《算法零基础100讲》(第22讲) 字符串算法(二) - 字符串比较二. 重点知识2.1 strcmp函数 strcmp是一个比较两个字符串的函数,从第一个字符开始,逐个比较(按照ASCLL码值),直到出现不同的字符或者出现’\0’。头文件#in原创 2021-11-11 17:05:38 · 539 阅读 · 0 评论 -
[题解]《算法零基础100讲》(第23讲) 字符串算法(三) - 字符串分割
文章目录知识讲解二. 课后习题2.1 最后一个单词的长度2.2 字符串中的单词数2.3 检查句子中的数字是否递增3.4 句子中的有效单词数3.5 截断句子3.6 检查二进制字符串字段知识讲解 字符串分割实际上就是用空格来表示把一个个子串分割成独立的字符串。分割前:分割后:二. 课后习题2.1 最后一个单词的长度题目链接:58. 最后一个单词的长度思路分析: 先从尾部开始遍历,把尾部的空格除去,然后开始遍历最后的个单词并计算长度。代码如下:int lengthOfLastWor原创 2021-11-12 22:37:27 · 597 阅读 · 1 评论 -
[题解]《算法零基础100讲》(第24讲) 字符串算法(四) - 字符计数法
文章目录知识讲解课后习题1. 判定字符是否唯一2. 第一个只出现一次的字符3. 赎金信4. 宝石与石头5. 判定是否互为字符重排6. 检查是否所有字符出现次数相同7. 242. 有效的字母异位词8. 有效的变位词9. 判断句子是否为全字母句10. 数组中第 K 个独一无二的字符串知识讲解 字符计数法的方法和原理都很简单,原理就是对ASCLL码的引用。使用方法:例如我们要统计一个字符串里,小写字母出现的个数int count(char *s){ int Hash[26] = { 0 };原创 2021-11-13 16:27:37 · 975 阅读 · 1 评论 -
[题解]《算法零基础100讲》(第25讲) 字符串算法(五) - 字符串反转
文章目录一. 概念讲解二. 课后习题2.1 反转字符串2.2. 反转单词前缀2.3 反转字符串中的元音字母2.4 翻转单词顺序2.5 翻转字符串里的单词2.6 反转字符串中的单词 III2.7 反转字符串 II2.8 仅反转字母2.9 整数反转一. 概念讲解 字符反转就是将一个字符串翻转过来,通常我们都是分别从首位同时进行调换,或则重新定义一个字符数组,将原本的字符串从尾部一一赋值给新串。代码如下:#include <stdio.h>void Reserved(char* s,原创 2021-11-14 18:04:13 · 510 阅读 · 1 评论 -
[题解]《算法零基础100讲》(第26讲) 字符串算法(六) - 回文串
文章目录一. 概念定义二. 判断方法三. 课后习题3.1 回文排列3.2 有效的回文3.3 验证回文串3.4 最长回文串一. 概念定义 回文串:回文串就是正向读取与反向读取结果是一样的,例如:abcba,正向读取结果为abcba,反向读取的结果也为abcba,这样的字符串即为回文串。二. 判断方法 我们不难发现,回文串有这样一个特性,首尾字符相等,所以我们可以分别从头部和尾部同时向中间进行判断,查看两端的字符是否相等,如不相等,则非回文串。如图:代码如下:#include <std原创 2021-11-15 19:08:03 · 646 阅读 · 3 评论 -
《算法零基础100讲》(第27讲) 字符串算法(七) - 高精度
文章目录一. 概念定义二. 专栏推荐三. 课后习题3.1 千位分隔数3.2 字符串转化后的各位数字之和3.3 字符串中第二大的数字3.4 最小时间差一. 概念定义 高精度其实就是当一个数无法用程序给定的数据类型表示时,我们通常用数组进行存储,模拟计算。二. 专栏推荐英雄哥的算法基础:《算法零基础100讲》(第27讲) 字符串算法(七) - 高精度三. 课后习题3.1 千位分隔数1556. 千位分隔数分析: 这道题很好理解,就是从尾部开始,每隔三个数加一个 ’ . ’ 字符。代码思路:原创 2021-11-16 18:56:43 · 729 阅读 · 3 评论 -
[题解]《算法零基础100讲》(第28讲) 递推问题
今日题解1.斐波那契数2. 第 N 个泰波那契数3. 杨辉三角4. 杨辉三角 II5. 爬楼梯6. 圆圈中最后剩下的数字1.斐波那契数题目链接:509. 斐波那契数分析: 这道题的初始条件为f(0) = 0,f(1) = 1,后面的数字是其前面两个数字的和,例如f(2) = f(0) + f(1) = 1。所以我们要直到f(n),首先就得知道f(n - 1) 和 f(n - 2)代码如下:int fib(int n){ if(n == 0){ return 0;原创 2021-11-17 17:29:23 · 271 阅读 · 0 评论 -
[题解]《算法零基础100讲》(第29讲) 容斥原理
文章目录一. 容斥原理1.1 集合AUB1.2 集合AUBUC二. 知识回顾三. 课后习题3.1 丑数 III3.2 播放列表的数量一. 容斥原理 容斥原理在我们的高中数学中由了解过,就是两个集合A,B的并集的元素个数。同样,在大学里的概率论中也会讲解。1.1 集合AUB 在概率论中,我们有这样的一个公式:A U B = A + B - (A∩B)如图:由于A与B有重叠部分,所以A+B后要减去一次重叠的部分(A∩B)。1.2 集合AUBUCA U B U C= A + B + C -原创 2021-11-18 18:16:50 · 1861 阅读 · 3 评论 -
[题解]《算法零基础100讲》(第30讲) 概率与统计
文章目录一. 今天就不将概念了,直接上题二. 题解2.1 飞机座位分配概率2.1.1 题目链接2.1.2 思路分析:推导过程2.2 期望个数统计2.2.1 题目链接2.2.2 思路分析2.3 470. 用 Rand7() 实现 Rand10()2.3.1 题目链接2.3.2 思路分析一. 今天就不将概念了,直接上题二. 题解2.1 飞机座位分配概率2.1.1 题目链接1227. 飞机座位分配概率2.1.2 思路分析: 这道题我们可以通过分析计算得到这样一个公式:推导过程代码如下:do原创 2021-11-19 21:42:48 · 280 阅读 · 1 评论 -
[题解]《算法零基础100讲》(第31讲) 多维枚举(一) - 入门
文章目录一. 推荐专栏二. 多维枚举二. 课后练习2.1. 找不同2.1.1 题目链接:2.1.2 思路分析2.2 拥有最多糖果的孩子2.2.1 题目链接2.2.2 思路分析2.3 所有奇数长度子数组的和2.3.1 题目链接2.3.2 方法一 暴力2.3.3 方法二 前缀和2.3.4 方法三 数学2.4 统计好三元组2.5 按既定顺序创建目标数组2.5.1 题目链接2.6 统计平方和三元组的数目2.6.1 题目链接一. 推荐专栏《算法零基础100讲》(第31讲) 多维枚举(一) - 入门原创 2021-11-20 21:14:16 · 661 阅读 · 5 评论 -
[题解]《算法零基础100讲》(第32讲) 多维枚举(二) - 进阶
文章目录一. 概念定义1.1 多维枚举二. 相关练习一. 概念定义1.1 多维枚举由之前的讲述我们知道,线性枚举就是用一个循环进行一次遍历,多维枚举就是在循环里面嵌套一个或多个循环。for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ for(int k = 0; k < n; k++){ ... } }}二. 相关练习...原创 2021-11-21 22:14:28 · 748 阅读 · 4 评论 -
[题解]《算法零基础100讲》(第33讲) 排序入门 - 冒泡排序
文章目录一. 冒泡排序二. 相关练习2.1 颜色分类2.2 寻找两个正序数组的中位数2.3 至少是其他数字两倍的最大数一. 冒泡排序 冒泡排序的原理就和从水底的冒上来的气泡一样,气泡越大,其排开的水体积就越大,上浮的也就越快,所以一般上面的气泡会比下面的气泡要大(当然气泡上升过程中不断变大是因为水压减小的缘故),而冒泡排序的形式也是差不多的,如果是进行升序排序的话,就是将较大的数据往右边移动,每次循环都会将一个最大的数据排到最右边。例图:所以经过多轮排序后,整个数组就排成了一个升序的形式。代原创 2021-11-22 09:43:15 · 432 阅读 · 0 评论 -
[题解]《算法零基础100讲》(第34讲) 排序入门 - 选择排序
文章目录一. 快速排序二. 课后练习2.1 有效三角形的个数一. 快速排序 快速是一个简单且直观的排序算法,主要的算法思想就是,在一个未排好序的序列中找出最小的值,并把它放在该序列的最前面。如图所示:每一次排序都将该序列的最小的值放在最前面,然后再继续找出后面的序列中的最小值,也就是总序列的第二小值,以此类推,达到升序的效果。代码如下:void SelectionSort(int* arr, int arrSize){ for(int i = 0; i < arrSize -原创 2021-11-23 20:28:54 · 217 阅读 · 0 评论 -
【题解】《算法零基础100讲》(第35讲) 排序入门 - 插入排序
文章目录一. 插入排序二. 相关练习一. 插入排序 插入排序是一个较为简单的排序,同样也比较基础,其原理就是将第i个元素a[i]分别与前 i - 1个元素进行比较,如果a[ i ]<a[i - 1],那么a[i - 1]往后移,直到找到比a[i]小的数。如图所示:代码如下:void InsertSort(int* nums, int Size){ for(int i = 1; i < Size; i++){ int j; int m = n原创 2021-11-24 22:00:57 · 179 阅读 · 0 评论 -
【题解】《算法零基础100讲》(第36讲) 排序进阶 - 归并排序
文章目录一. 归并排序二. 相关练习一. 归并排序 今天讲解的是归并排序,归并排序就是我觉得可以将其称为区间排序,它的整个过程就是将一个数组不断地对半拆分,最后拆成两对两对,在进行排序,如何再将相邻地两队分别合并排序,直至最后将mid左右两边的区间进行合并排序。动态如图:代码如下:#include <stdio.h>#include <stdlib.h>void MergeSort(int *nums, int l, int r){ if(l >= r)r原创 2021-11-25 21:12:08 · 426 阅读 · 0 评论 -
【题解】《算法零基础100讲》(第37讲) 排序进阶 - 快速排序
文章目录一. 快速排序二. 推荐专栏三. 相关练习有序数组的平方一. 快速排序 快速排序的原理就是随机选取一个关键值key,或者称为哨兵,每轮排序的结果都是将所有小于key的值放到左边,大于key的值在右边,然后再分别对两边的数据进行快排。如图:我们将上面的过程进行拆分,假设我们定义了一个数组nums[] = {3, 4, 9, 1, 3, 2, 5, 6};则有如下数据。一般情况我们都是令第一个数据为key,然后用双指针left和right分别指向左右两端,然后用left找出大于key的原创 2021-11-27 20:16:45 · 739 阅读 · 0 评论 -
[题解]《算法零基础100讲》(第38讲) 排序进阶 - 希尔排序
文章目录一. 希尔排序二. 推荐专栏三. 相关练习排序数组一. 希尔排序 希尔排序是在插入排序的基础上进行的优化,弥补了插入排序存在的一些缺点。例如,我们由一个长度为非常长的数组,刚好最小的值是在最后面,如果我们用插入排序的话需要移动的元素太多了,那我们有什么办法将其更快的靠近下标为0的位置呢?这时我们就有了希尔排序。 希尔排序又称最小增量排序,我们需要一个最小增量gap,gap = 数组长度 / 2,将间隔为gap的数字为一组,对这一组的数据进行插入排序,每次排好gap /= 2。现在我们对其原创 2021-11-27 18:56:01 · 250 阅读 · 0 评论 -
【题解】《算法零基础100讲》(第39讲) 排序进阶 - 计数排序
文章目录一. 计数排序二. 推荐专栏三. 相关练习3.1 有效的字母异位词3.2 丢失的数字一. 计数排序 计数排序于1954年由 Harold H. Seward 提出,他使用的是通过消耗空间来提高时间的方法,例如我们由一组数据{8,7,7,6,5,2,2,3,3,4},如果我们要将其排序的话,我们可以定义一个数组arr[9],我们用数组的下标对应数组中的数据,并计数,由此我们可以得到arr[] = {0,0,2,2,1,1,1,2,1}。有这个数组我们可以直到,从0到8的数字中,每个数字有多少个,原创 2021-11-28 19:54:19 · 591 阅读 · 0 评论 -
【题解】《算法零基础100讲》(第40讲) 非比较排序 - 基数排序
文章目录一. 基数排序二. 推荐专栏三. 相关练习3.1 最大间距一. 基数排序 基数排序(radix sort):属于分配式排序,又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。如图:分析:首先是根据各位数字的大小进行装桶,或说分配,到原创 2021-12-04 11:41:19 · 429 阅读 · 0 评论 -
【题解】《算法零基础100讲》(第41讲) C语言 排序 API
文章目录一. 排序API二. 推荐专栏三. 相关练习3.1 排序数组3.2 多数元素3.3 存在重复元素3.4 最大间距3.5 按奇偶排序数组一. 排序API 排序API就是是同C语言内置的函数qsort进行排序。qsort的定义方式:void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));base是指需要排序的数组;num是数组的长度;siz原创 2021-12-04 13:19:31 · 856 阅读 · 0 评论