![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
机智的爆爆哥
只要你足够的优秀 这个世界没有理由不对你和颜悦色(^O^)
展开
-
自己写一个环形队列(java实现)
环形队列的实现其实挺简单 但有些关键的因素要记住先看图下面是 初始化状态的 定义两个指针 默认都为0这队列满了的情况 rear指针会指向最后元素+1的位置重点来了 如果知道队列为空呢是不是 两个指针同时指向一个位置的时候?也就是front==rear队列为满的条件呢(rear + 1) % maxsize == frontmaxsize指的就是数组长度了其实这是个公式 代换进去 验证一下就可以了还有求队列有效元素的公式(rear + maxsize - front) % max原创 2020-09-27 09:11:47 · 424 阅读 · 0 评论 -
二叉平衡树左右双旋(思维导图大纲+图解 看不懂来砍我!!!)
文章目录为什么要使用二叉平衡树?平衡树的定义思路大纲节点类AVL树类什么时候需要左旋?什么时候需要右旋为什么要双旋?测试双旋方法完整代码放上为什么要使用二叉平衡树?为了降低树的高度 避免出现树退化成数组的形式如这样平衡树的定义划重点任意节点的子树的高度差都小于等于1任意节点的子树的高度差都小于等于1任意节点的子树的高度差都小于等于1如果超过1 即为不平衡树 需要旋转了思路大纲图片保存下做个笔记哦先看一下这两个类 为后面做准备节点类方法:获取树的高度(重点掌握 递归原创 2020-10-30 11:43:51 · 1607 阅读 · 3 评论 -
二叉排序树的删除方法(思维导图一目了然!!!)
文章目录二叉排序树的定义节点类二叉排序树类三种删除情况1.删除叶节点2.删除只有一个孩子节点的非叶节点3.删除有两个孩子节点的非叶节点完整代码及测试二叉排序树的定义根据二叉排序树的定义 百科上有这几个这里我采用了第一种 没有键值对相等的节点 这样好做区分 便于理解 若有多个相同的则会造成影响了节点类class Node { Node left; Node right; int value; /** * 插入方法 判断插入的元素比根节点大还是小 小放原创 2020-10-28 10:05:53 · 2553 阅读 · 4 评论 -
排序(四)希尔排序的两种不同实现
看图广为流传的图 确实很形象希尔是插入排序的优化别看他好几个循环 但他的时间复杂度最坏也是跟插入排序一样罢了思路是这样的我们需要一个增量gap 他每次都是变化的 每次循环完毕 都会在原来的基础上除2 而默认值为数组长度的一半他有一个好处 就是在大数据量下 整个排序的次数也不会太大假如一个数组的长度为10//第一次循环for(int i=5;i<arr.length;i+=5){ for(int j=i-5;j>=0;j-=5){ //每次都是分组 两两原创 2020-09-27 10:18:02 · 267 阅读 · 1 评论 -
排序(一)冒泡排序 你真的会吗?
数据结构与算法 想必大家是处于既快乐 又痛苦的感觉快乐在于做出题目 一次运行成功后的喜悦痛苦在于 绞尽脑汁 却还是做不出来今天说的是冒泡排序冒泡排序可一说是非常基础了但是开始学的时候 我又处于一种似懂非懂的状态好像明白了 过了一段时间 又给忘记了不知道你们会不会有这样一种感觉呢?其实就是没有真正的理解首先分享一张图片大家都知道 冒泡排序的时间复杂度为O² 其实就是两次循环就行了我们不能死记硬背思路是这样的按从大到小排列的话 找到最大的 下次循环就不需要看最大元素了所以大循环是递原创 2020-09-24 18:48:43 · 342 阅读 · 0 评论 -
排序(三)插入排序移位法和交换法
先看下图哦还是将问题拆分插入就相当于打牌 打牌会将牌有顺序的插入到某个位置 最终达到有序的状态这样方便出顺子 炸弹什么的插入也是一样思路是这样的 一步步的排序 把第一个元素变有序 有人说这不废话嘛 一个元素哪来的有序之分呢?对!所以我们插入排序应跳过第一个元素 直接从第二个元素开始比较 默认第一个元素是有序的随后可以将数组想成两部分每次循环完毕后 前一部分都是有序的 后一部分都是无序的 直到所有都有序为止因此我们将第二个元素与第一个元素做比较如果发现arr[0]>arr[1]原创 2020-09-27 09:55:49 · 4045 阅读 · 2 评论 -
关于Stream和Map的巧用
题目是这样的//假设db中有两个这样的表 数据有100w 最终要返回的是Provice表的List集合 如果status为fasle 则不返回 如何在java层面解决呢?public class Mydemo { static ArrayList<Province> provinces = new ArrayList<>(); static ArrayList<ProvinceStatus> provinceStatusList = new原创 2021-12-25 17:28:20 · 620 阅读 · 0 评论 -
leetcode 204. 计数质数
leetcode链接两种方法 暴力+埃筛法1.暴力法class Solution { public int countPrimes(int n) { //暴力解决 如果n在 1到 n-1内都没有能被整除的 那么就是素数 int count =0; for(int i=2;i<n;i++){//2 3 4 5 6 7 8 9 count+=isPrime(i)?1:0; } retu原创 2021-08-05 10:18:08 · 150 阅读 · 0 评论 -
leetcode 剑指 Offer 24. 反转链表
leetcode题目跳转链接class Solution { public ListNode reverseList(ListNode head) { //不依靠中间变量 以迭代的方式很难完成 ListNode cur=head,pre=null,temp=null; while(cur!=null){ //临时变量指向cur的下一个 这样cur=head 就可以指向null了 temp=cur..原创 2021-08-03 09:55:28 · 158 阅读 · 0 评论 -
java非递归实现图的dfs和bfs(图解+大纲清晰明了)
文章目录准备工作图的创建广度优先遍历思维导图大纲测试深度优先遍历思维导图大纲测试准备工作图的创建class Graph { //表示顶点数量 private int V; //表示边的数量 private int E; private Queue<Integer>[] adj; private boolean[] marked; //初始化图 public Graph(int n) { V = n原创 2020-11-15 10:54:38 · 690 阅读 · 0 评论 -
堆排序的一些思路 看下去 相信会有收获
给出一些思路 希望能帮到大家也算是做个记录 自己忘记了也能够看到先明确一些概念注意我圈出的部分开始啦!!!!!!!!!!!!假设我们要对这样的数组进行排序思路是这样的如果是升序排列 先要将该树变为大顶堆根节点与末尾元素交换 放在数组末尾 那就是9接着将除9外的元素变成大顶堆 根元素为最大元素在与末尾元素进行交换 放在数组末尾 之后是8一直循环。。。。完全有序我觉得关键的有两部分1.堆排序是基于完全二叉树的 即从左至右一直连续 中间不能有坑2.如何找到他从下往上 从原创 2020-10-14 09:12:45 · 232 阅读 · 0 评论 -
排序(七) 基数排序的一些思路
基数排序也叫桶排序 他是根据位数来排序的循环的次数只跟位数有关 所以在时间效率上会很高相反的 空间的开辟会更大些 不过这好解决 时间才是第一位的不足之处的话 不好处理小数 负数说下思路将所有元素取个位数 依次放入 0~9的桶中之后依次从桶中取出数据 放回原数组再按十位数取 依次放入0~9的桶中反复多次最后的数组就有序了非常适合大数据量的排序所以我们首先要确定数组中最大元素的长度 或者说是几位数 来确定大的循环int max = arr[0]; for (int原创 2020-10-01 10:34:30 · 964 阅读 · 0 评论 -
青蛙跳台阶问题
一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。在数量很小的情况下 我们很简单的就知道问题的解如台阶为1f(1)=1 一种跳法1跳f(2)=2 两种跳法1跳+1跳2跳f(3)=3 三种跳法1跳+2跳1跳+1跳+1跳2跳+1跳f(4)=5 五种跳法1跳+1跳+2跳2跳+2跳2跳+1跳+1跳1跳+2跳+1跳1跳+1跳+1跳+1跳第n=4的时候是最能够体现出跳法的规律的注意后面加粗的字体 前两种跳法是在f(2)的基原创 2020-09-28 10:43:24 · 189 阅读 · 0 评论 -
排序(二) 选择排序
今天来总结一下选择排序 授人以鱼 不如授人以渔复杂的算法 我们应该要有分治的思想 将复杂的问题拆分成一个个的小问题才能解决选择排序的思路是这样的首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。小循环里 先找到最小值 放在最前面 如何找到最小值呢 ?先假定第一个数为最小的 然后依次遍历 如果碰到比他小的 那min的值就更新 遍历完毕后将最小值元素与与第一个元素发生位置互换原创 2020-09-25 12:21:22 · 220 阅读 · 0 评论 -
力扣1672位运算详解 找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符
示例:输入: a = 1, b = 2输出: 2一种非常巧妙的位运算方法解决该题 由于有些复杂 单独写下来首先我们要考虑两种情况 a 和 b之间的加减为不会造成溢出所以分为溢出 不溢出而溢出和不溢出要分为a b同号 a b异号的情况还有就是两者同号 都为正 都为负的情况多种情况 看我慢慢道来 代码如下 若看的懂则跳过就好啦class Solution { public int maximum(int a, int b) { int k = b...原创 2020-07-17 17:08:56 · 1115 阅读 · 0 评论