数据结构与算法
不忘初心Eternity
非学,无以质疑。非问,无以广识。
展开
-
Java 基于2-3 树实现左倾红黑树(插入、删除、遍历、获取最值、遍历)
左倾红黑树在经典红黑树上加了一个限制:红色结点只能是左孩子。建议学习红黑树从2-3树——左倾红黑树——经典红黑树学起,方便理解及进一步学习。下面记录一下我学红黑树的过程及记录:一、左倾红黑树的定义左倾红黑树是含有红黑链接并满足下列条件的二叉查找树:红链接均为左链接;没有任何一个结点同时和两条红链接相连;该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同;下面是红黑树与2-3树的对应关系:二、平衡化在对红黑树进行一些增删改查的操作后,很有可能会出现红色的右链接或者两条原创 2020-09-14 21:34:10 · 807 阅读 · 0 评论 -
二叉树复习+Java实现二叉搜索树(创建、插入、删除、四种遍历、求深度)
一、树的概念回顾1、树具有以下特点:1、每个结点有零个或多个子结点;2、没有父结点的结点为根结点;3、每一个非根结点只有一个父结点;4、每个结点及其后代结点整体上可以看做是一棵树,称为当前结点的父结点的一个子树;2、树的相关术语结点的度:一个结点含有的子树的个数称为该结点的度;叶子结点:度为0的结点称为叶结点,也可以叫做终端结点分支结点:度不为0的结点称为分支结点,也可以叫做非终端结点结点的层次:从根结点开始,根结点的层次为1,根的直接后继层次为2,以此类推树的度:树中所有结原创 2020-09-12 21:13:46 · 318 阅读 · 2 评论 -
Java实现排序算法(冒泡、选择、插入、希尔、归并、快排)
重拾经典排序算法排序算法分为简单排序(冒泡、选择、插入)、高级排序(希尔、归并、快排)一、简单排序1、冒泡排序:比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值Java实现://冒泡排序实现1:把大值往后沉public static int[] sort2(int[] a) { int len = a.length; //求数组长度 fo原创 2020-09-09 21:24:49 · 457 阅读 · 0 评论 -
广联达秋招提前批Java开发笔试复盘(7月22日)
一、广联达笔试(7月22日)1、平行四边形构造题目描述: 给出你n条长度不一的边,请你从中选择四条边,组成一个最大的平行四边形。请你输出最大的平行四边形的面积。输入描述 输入第一行包含一个正整数n,表示边的数量。(4<=n<=50000) 输入第二行包含n个正整数,表示n条边的长度,边的长度不会超过10^9。输出描述 输出仅包含一个正整数,即最大的平行四边形的面积,无解则输出-1。样例输入53 3 4 4 5样例输出12AC#include<原创 2020-07-22 23:17:01 · 2146 阅读 · 0 评论 -
判断二叉树A是否存在子树B
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)剑指offer原题:JZ17树的子结构解题思路:1、首先设置标志位res = false,因为一旦匹配成功res就设为true,剩下的代码不会执行,如果匹配不成功,默认返回false2、递归思想,如果根节点相同则递归调用judge(TreeNode *root1, TreeNode *root2),如果根节点不相同,则调用HasSubtree判断pRoot1的左子树和pRoot2是否相同,若不同,则原创 2020-07-16 22:45:26 · 746 阅读 · 0 评论 -
6月&剑指offer刷题记录
剑指offer刷题记录一、贪心题1、剪绳子 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。解题:此题为贪心题,每次减掉3,最后剩下的有三种情况: **情况1:**为0时,n%3==0,最大乘积为pow(3, n/3) **情况2:**为原创 2020-06-30 22:45:17 · 656 阅读 · 0 评论 -
打开转盘锁 ,易懂的BFS解法
打开转盘锁 LeetCode752题目描述:你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋原创 2020-06-05 14:10:34 · 922 阅读 · 1 评论 -
滑动窗口算法框架与例题实践(C++版)
首先给出算法的框架模板:/* 滑动窗⼝算法框架 */void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid = 0; while (right < s.size()) { // c 是将移⼊窗⼝的字符 char c = s原创 2020-05-20 22:19:43 · 436 阅读 · 0 评论 -
并查集—— 朋友圈子数、畅通工程、小希的迷宫、More is better
题目描述:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?Input测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道...原创 2020-03-07 10:59:33 · 146 阅读 · 0 评论 -
旋转图像LeetCode
题目描述:给定一个 n×n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix =[ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2],...原创 2020-02-16 11:59:07 · 152 阅读 · 0 评论 -
棋盘问题dfs练习
题目:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。Input输入含有多组测试数据。每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k &...原创 2020-02-11 16:40:45 · 282 阅读 · 0 评论 -
抓住那头牛bfs练习
问题:抓住那头牛农夫知道一头牛的位置,想要抓住它。农夫和牛都于数轴上 ,农夫起始位于点 N(0<=N<=100000) ,牛位于点 K(0<=K<=100000) 。农夫有两种移动方式: 1、从 X移动到 X-1或X+1 ,每次移动花费一分钟 2、从 X移动到 2*X ,每次移动花费一分钟 假设牛没有意识到农夫的行动,站在原地不动。最少要花多少时间才能抓住牛?In...原创 2020-02-11 11:33:10 · 659 阅读 · 0 评论 -
剪绳子(贪心/动态规划)
准备找工作,开始刷题,牛客剑指offer链接:https://www.nowcoder.com/questionTerminal/57d85990ba5b440ab888fc72b0751bf8?f=discussion给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[...原创 2020-01-14 15:56:09 · 642 阅读 · 0 评论 -
动态规划——编辑距离
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1: 输入: word1 = “horse”, word2 = “ros”输出: 3解释:horse -> rorse (将’h’ 替换为 ‘r’)rorse -> rose (删除...原创 2019-08-16 11:09:03 · 108 阅读 · 0 评论 -
乘积的最大子序列
题目描述:给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。示例 1: 输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2: 输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。题目来源:力扣(LeetCode)链接:https://leetcode...原创 2019-08-12 11:58:57 · 182 阅读 · 0 评论 -
有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)...原创 2019-08-01 11:48:38 · 155 阅读 · 0 评论 -
三数之和java
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]来源:力扣(LeetCode)链接:...翻译 2019-08-03 11:05:55 · 293 阅读 · 0 评论