算法
文章平均质量分 84
算法学习
RBLT
say it,do it,be it
展开
-
完全理解图(上)——图的概念、存储及遍历
图的存储结构、遍历原创 2021-08-03 08:56:50 · 1174 阅读 · 2 评论 -
完全理解二叉树(下)——平衡二叉树、二叉排序树、哈夫曼树
二叉树的应用1. 平衡二叉树二叉树可以用于查找元素,对于如下这颗二叉树:对其的遍历相当于对链表的遍历,因此找到元素5需要从头开始,查找5次,但是如果树的形状是这样:从根结点出发只需要查找3次即可找到元素5。1.1 定义左右子树高度差不超过1的二叉树称为平衡二叉树(AVL树),注意是对于树中的任意结点。例如:都不是平衡二叉树。结点的平衡因子 = 左子树高 - 右子树高,平衡因子的绝对值不超过1,如下图所示:1.2 存储结构typedef struct AVLTreeNode*原创 2021-06-11 10:10:51 · 927 阅读 · 0 评论 -
完全理解二叉树(中)——二叉树与树、森林的转化及遍历
完全理解二叉树(上)——二叉树的概念、遍历、构造以及线索化1. 树与二叉树的转化现有如下一颗树:将其转化为二叉树的过程为:加线:在同一层中,将兄弟结点(注意没有堂兄弟结点)连接起来,下图中红色部分。去线:对每一个结点来说,只保留其第一个孩子结点,其余孩子结点的连线全部删除,下图中蓝色部分。去掉蓝色部分得到:最后调整层序,黑线必为左孩子,红线为右孩子:2. 森林与二叉树的转化现有如下一个森林:将其转化为二叉树的过程为:树转化成二叉树,先将森林中所有的树转化成二叉树:原创 2021-06-03 10:24:00 · 795 阅读 · 0 评论 -
完全理解二叉树(上)——二叉树的概念、遍历、构造以及线索化
术语结点的度:结点的子树个数树的度:树的所有结点中最大的度数结点的层次:规定根结点在 1 层,其他任一结点的层数是其父结点的层数 +1树的深度(高度):树中所有结点中的最大层次叶结点:度为 0 的结点父结点:有子树的结点子结点:A为B的父结点,则B为A的子结点兄弟结点:具有同一父结点的各结点祖先结点:沿树根到某一结点路径上的所有结点都是这个结点的祖先结点子孙结点:某一结点的子树中所有的结点堂兄弟结点:父结点在同一层的结点森林:若干颗互不相交的树的集合树一、定义n 个结点构成原创 2021-06-01 19:40:17 · 469 阅读 · 0 评论 -
如何通俗易懂地理解分治
本节需要先理解递归的含义:如何通俗易懂地理解递归一、引例描述对给定数组中的数字进行排序,要求在O(nlogn)时间内完成样例输入:7 1 5 3 2 4 7 6输出:1 2 3 4 5 6 7 二、原理定义(引自维基百科)在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范型。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分析思路一(归并):对于数组排序的问题,可以考虑原创 2021-05-24 20:36:55 · 383 阅读 · 0 评论 -
如何通俗易懂地理解递归
一、引例描述给定一个数字 n(范围在0~10),求 n 的阶乘样例输入:0 输出:1输入:5输出:120算法设计首先最容易想到的就是利用循环做,即进行 n-1 次循环,然后每次循环中进行累乘,最后输出结果,再加一个特殊值判断(0! = 1),那么很容易编写代码如下:#include <iostream>int main(){ int n = 0,num = 1; std::cin >> n; while(n > 0)原创 2021-05-14 15:48:32 · 3335 阅读 · 0 评论 -
C++存在重复元素(三种解法详解)
题目链接:存在重复元素题目描述给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。样例输入与输出示例1:输入:[1,2,3,1]输出:true示例2:输入:[1,2,3,4]输出:false示例3:输入:[1,1,1,3,3,4,3,2,4,2]输出:true解法1(排序)思路将所有元素排好序,然后扫描数组,如果一个数与它前一个元素相等,那么就是重复的。代码class Solu原创 2021-02-01 11:41:39 · 8648 阅读 · 0 评论 -
C++旋转数组(三种解法详解)
C++旋转数组(三种解法详解)题目链接:旋转数组题目描述给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。附加要求尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?样例输入与输出输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5原创 2021-01-28 15:32:28 · 3086 阅读 · 0 评论 -
不用循环做数组排序
不用循环做数组排序利用递归改写冒泡排序#include <iostream>using namespace std;int k = 0,index = 0,n = 10;int sort(int A[],int i,int j,int n){ if(A[j] > A[i]) k++; return (n > 0)?sort(A...原创 2020-02-25 13:16:24 · 1182 阅读 · 0 评论 -
二分算法题目训练(四)——Robin Hood详解
codeforces672D——Robin Hood详解Robin Hood问题描述(google翻译)我们都知道罗宾汉令人印象深刻的故事。罗宾汉利用他的射箭技巧和他的智慧从富人那里偷钱,然后把它归还给穷人。在Kekoland有n个公民,每个人都有ci硬币。每天,罗宾汉将从该市最富有的人那里拿出1枚硬币,然后将它交给最贫穷的人(最富有的1枚硬币后最穷的人)。如果选择不是唯一的,他将...原创 2018-08-08 19:16:51 · 1494 阅读 · 1 评论 -
二分算法题目训练(三)——Anton and Making Potions详解
codeforces734C——Anton and Making Potions详解 Anton and Making Potions题目描述(google翻译)安东正在玩一个非常有趣的电脑游戏,但现在他被困在其中一个级别。为了进入下一个级别,他必须准备n个药水。安东有一个特殊的水壶,可以在x秒内准备一个魔药。此外,他知道两种类型的法术可以加快准备魔药的过程。这种类型的法术加速...原创 2018-08-08 18:18:01 · 274 阅读 · 0 评论 -
二分算法题目训练(二)——Exams详解
CodeForces732D——Exams 详解Exam题目描述(google翻译)Vasiliy的考试期限将持续n天。他必须通过m门科目的考试。受试者编号为1至m。大约每天我们都知道当天可以通过m个科目中的哪一个的考试。也许,有一天你不能通过任何考试。任何一天都不允许通过多个考试。每天Vasiliy都可以通过当天的考试(需要一整天)或准备一整天的考试或休息。关于每个主题V...原创 2018-08-08 17:37:02 · 763 阅读 · 0 评论 -
二分算法题目训练(一)——Shell Pyramid详解
Shell Pyramid 详解Shell Pyramid题目描述(Google 翻译的) 在17世纪,由于雷鸣般的喧嚣,浓烟和炽热的火焰,海上的战斗与现代战争一样。但那时,大炮非常简单。它就像一个铁缸,其后端密封,前端打开。它的后端有一个小孔,用来安装保险丝。战舰上的大炮被放在有四个轮子的小型车辆上,炮弹是铁球,里面装着火药。当时,据说有一位聪明的船长,他也是一位数学家的业余爱好者...原创 2018-08-08 16:50:02 · 427 阅读 · 0 评论 -
最详解——寻找两个有序数组的中位数
参考:【分步详解】两个有序数组中的中位数和Top K问题题目描述给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [...原创 2019-09-02 11:03:56 · 1105 阅读 · 0 评论 -
最详解——无重复字符的最长子串
题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “w...原创 2019-08-31 11:22:25 · 273 阅读 · 0 评论 -
最详解——两数相加
题目描述给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -...原创 2019-08-30 15:58:59 · 714 阅读 · 0 评论