随笔分类 - 数据结构
中位数
摘要:import java.util.*; public class Main{ static int[] a; static int[] b; static int l; public static void main(String[] args){ Scanner sc = new Scanne
强连通分量
摘要:#include<bits/stdc++.h> using namespace std; int n; // 节点数量 int G[1010][1010]; // 图的邻接矩阵表示 int Time,sum; // Time用于记录DFS的时间,sum用于记录强连通分量的数量 int beg[101
矩阵连乘
摘要:import java.util.Scanner; class Main { // 定义矩阵类 static class Matrix { int x, y; // x表示矩阵的行数,y表示矩阵的列数 } static Matrix[] a; // 存储矩阵数组 static int[][] m;
回溯大合集+主元素+DFS图
摘要:子集和问题 import java.util.Scanner; public class Main { static int n; // 元素个数 static int tarsum; // 目标和 static int remainSum = 0; // 当前元素加到最后一个元素的总和,剩余元
背包问题大合集
摘要:dp背包3步曲 1.确定dp[i] [v]的含义(一维的话是dp[v]) :在 0…i 的物品中,体积为 v 的背包中,能够拿到的最大价值为 dp[i] [v]。 2.求关系式 不拿物品:(物品数量减少) 一维:dp[v] 二维:dp[i] [v] = dp[i-1] [v] 拿:(物品数量减少,背
二分搜索树(校招数据结构最低要求版)Java
摘要:二分搜索树(Binary Search Tree,BST)是一种常见的数据结构,它能够高效地存储和查找数据。它的特点是每个节点都包含一个值,并且每个节点的左子树的值都小于节点的值,右子树的值都大于节点的值。 查找 通过这种有序的排列方式,我们可以在二分搜索树中进行高效的查找操作。想象一下,如果我们要
力扣875. 爱吃香蕉的珂珂(二分查找)
摘要:珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有piles[i]根香蕉。警卫已经离开了,将在 h 小时后回来。 珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。 如果这堆香蕉少于 k 根她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。
二分查找法lowerCeil版(找某个重复值的最小下标)利用二分upper法实现
摘要:也是利用二分的upper法实现的,不知道什么是upper?看这里 -> 二分查找法upper版(找大于某个值的最小下标)递归+非递归版 - 翰林猿 - 博客园 (cnblogs.com) 思路: 先利用upper找到上界的index 拿着index-1的下标(也就是重复值的最大下标)向前遍历,一直到
二分查找法ceil版(找某个重复值的最大下标)利用二分upper法实现
摘要:如果有等于target的元素就返回最大的下标元素。 如果没有等于target的元素,那么就返回大于target的最小元素,即这一篇文章实现的upper函数。二分查找法upper版(找大于某个值的最小下标)递归+非递归版 - 翰林猿 - 博客园 (cnblogs.com),当然你们也可以更改返回值-1
二分查找法upper版(找大于某个值的最小下标)递归+非递归版
摘要:需求:比如说查询一个班级大于60分的最低分等等。 思路与二分法基本相同,只不过是对比的逻辑发生了一些小变化,这里所说的上界就是指大于某个值的最小下标。 当mid < target :说明 target 的上界还在mid的右边,所以要去找比mid大的 当mid > target:说明 mid 有可能是
选择排序算法之泛型优化
摘要:选择排序算法 工作原理: 每一次从待排序的数据元素中选中最小的一个元素,然后,再从剩余未排序元素中继续寻找最小元素,将2个元素交换位置,就达到了已排序的元素一直是从小到大了。 这个算法的时间复杂度为O(n²),空间复杂度为O(1)。 /** * @Author: 翰林猿 * @Description
归并排序Java版(图文并茂思路分析)
摘要:归并排序 工作原理: 工作原理是将一个大问题分解成小问题,再将小问题分解成更小的。(乍一看就觉得是像一个递归)就像下图这样。然后不断的将其一份为二,分解成更小的排序。 我们设一个函数叫MergeSort(arr,l,r)意思就是将arr数组下标为[ l ,r ]之间的数进行排序。 那么就开始不断的调
三路快排Java版(图文并茂思路分析)
摘要:## 快速排序 这里我们直接开始讲相对的最优解 **带随机数的三路快排** 好了,中间还有很多版本的快排,但是都有一些问题导致在某种极端情况下造成耗费时间极多。 - 基础快排:在**序列本身有序**的情况下复杂度为O(n²) - 带随机数的快排:在**序列本身有序**的情况下复杂度为O(nlogn)
一篇看懂递归的套路解题法
摘要:递归 所谓递归,不过是将一个复杂问题分解为一个更小的问题进行求解,在这里我们不再扯太多犊子了,网上有太多递归的介绍让人眼花缭乱摸不着头脑,我们直接开始讲解递归的解体思路。 第一步:求解最基本问题并将其返回 这一步也就是网上所谓的递归出口,但是个人认为递归出口不太能很好的描述这个意思,其实本质就是求出
插入排序Java版
摘要:插入排序 工作原理: 从头开始遍历数组,如果发现当前项比前一项小,说明当前项应该插到前面,交换一下即可。 利用双层for循环,第一层是遍历整个数组,第二层负责遍历当前所遍历到的位置之前的数组。 /** * @Author: 翰林猿 * @Description: 插入排序 **/ public cl
反转链表 Java版 图文并茂思路分析带答案(力扣第206题)
摘要:反转链表 力扣第206题 我们不只是简单的学习(背诵)一个数据结构,而是要分析他的思路,以及为什么要有不同的指针等等 非递归方式: 思路分析:首先要链表有个头指针没有任何问题 然后,我们要将1的下一个节点指向空,这样才能将其反转过来,但是这个时候我们发现和下一个节点2失去了联系 所以我们要有一个指针
哈希表之单词查找并输出其上下文
摘要:#哈希表之单词查找 英文文章,写入一个文本文档,作为基础测试数据。 建立一个待查关键字文件,存储待查询的单词。 输入查询的单词,输出该单词的出现次数,及每个出现位置的上下文(前一句,单词/短语所在的句子,下一句)。 目前只支持查询一个单词。 以下为代码: #include <iostream> #i