
数据结构与算法
基础的算法思想与代码实现
面向c v编程
这个作者很懒,什么都没留下…
展开
-
二叉树遍历模板
二叉树前序遍历,中序遍历,后序遍历,层序遍历原创 2022-08-17 11:33:35 · 257 阅读 · 0 评论 -
循环队列和循环双端队列
循环双端队列其实就是一个双端队列,即可以在队头和队尾都进行入队或者出队操作的队列。原创 2022-08-16 20:57:54 · 207 阅读 · 0 评论 -
高精度算法
高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又原创 2022-06-03 13:22:18 · 153 阅读 · 0 评论 -
数据结构--并查集
并查集并查集是一种非常精致而且实用的数据结构;它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子树,求最小生成数和求最近公共祖先等.并查集的主要操作有:1.初始化(init)2.查询(find)3.合并(union)假设有编号为1,2,3,4…,n的n个元素,我们用一个数组 fa[ ] 来存储每个元素的父节点,我们先将它们的父节点设为自己.// 并查集public class UnionFindSets { int[] fa; //1.初始化 pub原创 2022-05-27 16:26:05 · 256 阅读 · 0 评论 -
二分查找力扣习题(1)
模板 1:while (left <= right)LeetCode第35题为例:public int searchInsert(int[] nums, int target) { int len = nums.length; if (nums[0] > target) return 0; if (nums[len - 1] < target) return len ; int left = 0; int原创 2022-04-23 15:45:55 · 414 阅读 · 0 评论 -
二分查找力扣习题(2)
二分查找练习力扣习题题型二:在非有序的数组中使用二分查找33. 搜索旋转排序数组81. 搜索旋转排序数组 II153. 寻找旋转排序数组中的最小值154. 寻找旋转排序数组中的最小值 II162. 寻找峰值题型二:在非有序的数组中使用二分查找33. 搜索旋转排序数组33. 搜索旋转排序数组(中等)题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为原创 2022-04-23 15:43:08 · 332 阅读 · 0 评论 -
排序高级算法(2)快速排序
快速排序归并排序与快速排序都使用了「分治思想」归并排序拆分:不管数组的形态,总是将数组一分为二;组合:合并两个有序的数组。快速排序拆分:根据某个元素 pivot,将数组整理成两个部分; 前半部分小于 pivot, 后半部分大于等于 pivot; 把 pivot 交换到前半部分的最后一个元素。组合:什么都不用做。快速排序的基本想法快速排序每一次都排定一个元素(这个元素呆在了它最终应该呆的位置),然后递归地去排它左边的部分和右边的部分,依次进行下去,直到数组有序。快速排序的算法思想分而治之原创 2022-03-12 14:21:13 · 605 阅读 · 0 评论 -
排序算法(1)(归并排序)
归并排序排序算法的稳定性如果相等的元素在排序以后的位置保持不变,这样的排序算法就是稳定的排序算法.如果只是针对数值类型,谈论稳定性没有意义,稳定性针对有多个属性的对象类型而言,不稳定的排序算法对于数值相同的元素在排序前后的相对位置关系是不确定的.常用的排序算法中插入排序,冒泡排序,归并排序是稳定的排序算法.归并排序简介原创 2022-03-06 17:51:18 · 367 阅读 · 0 评论 -
排序算法(基础排序算法)
选择排序选择排序的基本思想:每一轮选取未排定的部分中 最小的元素交换到未排定部分的最开头,经过若干个步骤,就能排定整个数组。参考代码://选择排序public class Selectionsort { public int[] sortArray(int[] nums) { int len = nums.length; //当数组的长度小于2(即长度为0或者1)时,直接返回该数组; if (len < 2) {原创 2022-03-03 12:22:09 · 749 阅读 · 0 评论 -
单向环形链表(约瑟夫问题) 2
上一次我们学习了环形链表,今天我们来学习一下怎么运用环形链表解决约瑟夫问题.我们先来回顾一下约瑟夫问题:设编号为1,2,3…n个人围坐在一圈,约定编号为k(1<=k<=n)的人开始报数,数到m的人出列,它的下一位又从1开始报数,数到m的人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列.根据n,k,m,生成一个出队编号的序列思路:1.需要创建一个辅助指针(helper),实现应该指向环形链表的最后这个节点补充:当报数前,先让frist和helper移动k-1次;2.当原创 2021-12-09 21:22:01 · 456 阅读 · 0 评论 -
字符串匹配(暴力匹配算法(for循环,while循环))
让我们写来看一道字符串的题(LeetCode第28题)28. 实现 strStr()实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/implement-strstr暴力匹配思想:依次从haystack的首字符开始,与needle逐原创 2021-12-10 15:58:55 · 826 阅读 · 0 评论 -
单链表1(创建单链表与添加节点)
单链表什么是单链表?单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(val)+ 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。头指针head和终端结点:单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。链表由头指针唯一确定,单链表可以用头指针的名字来命名。终端结点无后继,故终端结点的指针域为空,即NULL。单链原创 2021-12-06 15:12:08 · 1025 阅读 · 2 评论 -
二叉树的遍历
二叉树的遍历二叉树的前序,中序,后序,层序的遍历步骤:第一步:创建用一个二叉树;第二步:1.前序遍历:1.1先输出当前节点,(初始为root节点(根节点))1.2如果当前节点的左子节点不为空,继续前序遍历(递归)1.3如果当前节点的右子节点不为空,继续前序遍历(递归)2.中序遍历:2.1如果当前节点的左子节点不为空,继续中序遍历(递归)2.2先输出当前节点2.3如果当前节点的右子节点不为空,继续中序遍历(递归)3.后序遍历:3.1如果当前节点的左子节点不为空,继续后序遍历(递归)原创 2021-12-06 18:10:13 · 270 阅读 · 0 评论 -
模拟栈的实现
实现栈的思路:1.使用数组来模拟栈;2.定义一个top来表示栈顶,初始化为-1;3.入栈:当有数据(data)加入(push)到栈时:top++,stack[top] = data;4.出栈: int value = stack[top]; top–; return value;代码://自己写的栈public class MyselArraysStack { /* 实现栈的思路: 1.使用数组来模拟栈; 2.定义一个top来表示栈顶,初始化为-1;原创 2021-11-29 18:22:12 · 392 阅读 · 2 评论 -
字符串匹配算法(KMP)
KMP算法JAVA代码实现“KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。KMP思路:1.先得到子串的部分匹配表;2.使用部分匹配表完成KMP算法;1.部分匹配表,把子串的原创 2021-12-18 16:21:59 · 351 阅读 · 1 评论 -
单向环形链表(约瑟夫问题) 1
单向环形链表开始前我们先介绍一下Josephu(约瑟夫)问题:设编号为1,2,3…n个人围坐在一圈,约定编号为k(1<=k<=n)的人开始报数,数到m的人出列,它的下一位又从1开始报数,数到m的人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列.让我们先来假设有5个人,编号为1的人开始报数,数到2的人出列,这个时候出队的编号的序列是多少呢?我们先画一个图:这里 1 2 3 4 5分别代表这5个人,第一个出队的应该为 2;然后就变成了这个时候应该3号开始喊1,所以原创 2021-12-09 20:45:55 · 486 阅读 · 0 评论 -
单链表2(删除与修改)
删除删除节点:(将val为val的节点删除)思路:1.head不能动,因此我们需要一个辅助节点temp找到待删除节点的上一个节点2.我们在比较时 要用 temp.next.val和需要删除的节点的val作比较代码如下: /* 删除节点:(将val为val的节点删除) 思路: 1.head不能动,因此我们需要一个辅助节点temp找到待删除节点的上一个节点 2.我们在比较时 要用 temp.next.val和需要删除的节点的val作比较 */ pub原创 2021-12-06 16:04:18 · 638 阅读 · 0 评论 -
字符串匹配算法(Sunday算法)
Sunday算法:Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。Sunday算法是从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位字符的下一位字符。Sunday算法的JAVA实现:public static int strStr(String haystack, String needle) { if (needle.length原创 2021-12-10 16:25:09 · 884 阅读 · 0 评论 -
归并排序模板
归并排序归并排序采用的是分治法思想,快速排序也是运用分治法的思想,但是它们的实现还是有不同的.归并排序的思路:(拆分)1.把长度为n的数组分成两个长度为n/2的子数组;然后利用递归,不断的寻找左子数组和右子数组,一直到数组的长度为1;(合并)对子序列排序,最后再用递归方法将排好序的子序列合并成为有序序列。合并两个子序列时,需要申请两个子序列加起来长度的内存,临时存储新的生成序列,再将新生成的序列赋值到原数组相应的位置。代码模板: public static void margeSort(in原创 2021-11-11 22:30:26 · 219 阅读 · 0 评论 -
二分查找算法
二分查找算法条件:二分查找法只适用于从有序的队列中进行查找(比如数字和字母等).1.整数的二分查找先让我们举个例子,比如给定一个数组a,必须保证数组有序,让我们在数组中查找一个元素,如果有则返回数组的索引,如果没有则返回-1.让我们来写一个方法public int test(int a[], int target) { int l = 0; int r = a.length - 1; while (l <= r) { // 循环判断,其实就是当原创 2021-11-06 21:11:35 · 175 阅读 · 1 评论 -
快速排序模板
快速排序快排思想:(分治法)先从数组中取出一个数作为基数(通常取第一个数)。分区过程,将大于或等于它的数全放到它的右边,小于或等于它的数全放到它的左边。再对左右区间重复第二步,直到各区间只有一个数。(递归思想)代码模板 public static void quickSort(int arr[], int left, int right) { if (left >= right) { //递归结束条件 return;原创 2021-11-10 22:01:27 · 227 阅读 · 0 评论 -
双指针算法
双指针算法:双指针算法一般分为3种情况:1.普通双指针: 两个指针往同一个方向移动;2.对撞双指针;两个指针往不同的方向移动;3.快慢双指针.慢指针+快指针.普通双指针:在这里让我们举一个例子:(力扣第1题)给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。!!!注意(1.只会存在一个有原创 2021-11-06 22:15:00 · 364 阅读 · 1 评论