算法及数据结构
小菜菜1223
qq846792646
展开
-
Linked List
链表相关算法题原创 2023-03-29 16:51:02 · 605 阅读 · 1 评论 -
面试准备(八)链表反转
解题思路一:链表指向的都是下一个元素的指针,如果想链表反转,需要使用一个变量保存一下下一个元素的指针。每一次处理结果作为下一次处理的初始值。解题思路二:递归思想大问题拆成小问题,必须从最后一个元素开始才能保证链表不断。代码:public class ReverseList { //内部链表类 static class ListNode{ int val; ListNode next; p...原创 2021-07-05 11:29:26 · 114 阅读 · 0 评论 -
面试准备(九)MySql索引
什么是索引:索引是帮助MySql高效获取数据的排好序的数据结构二叉树:如果是顺序存储,大的数据一直会往右侧插入。红黑树(二叉平衡树)如果数据量过大,树层级过大B树每次IO都会取出好几个节点进行查找B+树所有元素都在叶子节点,中间的冗余索引都是叶子节点最大的元素叶子节点大小从左往右依次递增。双向指针存储的两边地址,方便范围查询MySql索引默认存储到data目录下,一个库对应一个文件夹。MyISAM存储引擎(非聚集索引)会有三...原创 2021-07-09 16:27:06 · 106 阅读 · 0 评论 -
面试准备(二十)java HashMap
为什么用红黑树解决链表过长,查询效率过低的问题为什么不直接使用红黑树红黑树插入会很慢,要维护自己的结构为什么使用红黑树的阈值是8之所以是8,是因为Java的源码贡献者在进行大量实验发现,hash碰撞发生8次的概率已经降低到了0.00000006,几乎为不可能事件,如果真的碰撞发生了8次,那么这个时候说明由于元素本身和hash函数的原因,此次操作的hash碰撞的可能性非常大了,后序可能还会继续发生hash碰撞。所以,这个时候,就应该将链表转换为红黑树了,也就是为什么链表转红黑树的阈值是8。原创 2021-07-09 14:35:59 · 73 阅读 · 0 评论 -
面试准备(十八)三角形的最大周长
贪心算法:数组先排序,排序之后以最后三个数为基准,看是否满足a+b>c,不满足则把最大值由c改成b,再从a前边找个d,看a+d是否大于c。代码:import java.util.Arrays;public class Triangles { public static void main(String[] args) { System.out.println(largestPerimeter(new int[]{3,6,2,3})); } ...原创 2021-07-06 14:40:20 · 92 阅读 · 0 评论 -
面试准备(十七)柠檬水找零
贪心算法:局部最优解不影响全局解代码:public class lemonChange { public static void main(String[] args) { System.out.println(change(new int[]{5,5,20})); } public static boolean change(int[] bills){ int five = 0,ten=0; for(int bill:..原创 2021-07-06 14:31:51 · 66 阅读 · 0 评论 -
面试准备(十六)二叉树 深度优先 广度优先
深度优先:递归,从子节点往上计算深度,计算到根节点取最小值广度优先:从根节点往下找,找到叶子结点为止代码:import java.util.LinkedList;import java.util.Queue;public class TreeDeep { static class TreeNode{ int val; TreeNode left; TreeNode right; int deep; ...原创 2021-07-06 14:10:47 · 110 阅读 · 0 评论 -
面试准备(十四)排列硬币
解题思路:迭代:循环计算和大于n之后输出二分法:牛顿迭代:代码:public class ArrangeCoin { public static void main(String[] args) { System.out.println(arrangeCoins(10)); System.out.println(arrangeCoins2(10)); System.out.println(arrangeCoins3(10))...原创 2021-07-05 17:56:08 · 89 阅读 · 0 评论 -
面试准备(十五)求两数之和
解题思路:暴力解法:双重for循环map标记法:循环一次即可,每个数据进入map进行标记,寻找target-x在不在即可代码:import java.util.Arrays;import java.util.HashMap;import java.util.Map;public class TwoSum { public static void main(String[] args) { System.out.println(Arrays.toStr...原创 2021-07-05 16:50:45 · 80 阅读 · 0 评论 -
面试准备(十三)三个数的最大乘积
考虑数组中的正负数。解题思路:排序:排序之后取值比较线性扫描:循环一遍计算比较复杂度以及具体逻辑看代码:import java.util.Arrays;public class MaxProduct { public static void main(String[] args) { System.out.println(); } //排序后输出最大值 Nlog(n) public static int sort(int[] ...原创 2021-07-05 16:36:26 · 109 阅读 · 0 评论 -
面试准备(十二)寻找数组中心下标
解题思路:双指针算法,循环数组,total(初始为0)从当前元素累加,sum(数组之和)如果不等于total,减去当前元素,继续循环。代码:import java.util.Arrays;public class ArrayCenterIndex { public static void main(String[] args) { System.out.println(pivotIndex(new int[]{1,7,3,6,5,6})); } ...原创 2021-07-05 15:23:17 · 83 阅读 · 0 评论 -
面试准备(十一)删除排序数组
不能使用set。解题思路:前提是:有序数组定义一个快指针j,定义一个慢指针i。开启循环,i,j一起往后循环,当发现i与j相等之后,i停止循环,j继续循环,直到j与i不相等之后,将i+1赋值为j,继续循环,最后返回i的值即可。代码:public class SortedArrayDuplicates { public static void main(String[] args) { System.out.println(removeDuplicates(n...原创 2021-07-05 15:12:51 · 68 阅读 · 0 评论 -
面试准备(十)素数个数统计
解题思路一:暴力解法:每个数n都计算与n-1之内的数能否整除(后期可以优化到与2-根号n之间)。解题思路二:埃筛法:利用合数的概念,素数*n必然是合数,因此可以从2开始遍历,将所有合数提前做上标记,减少计算。代码:public class PrimeNumber { public static void main(String[] args) { System.out.println(bf(100)); System.out.printl...原创 2021-07-05 14:44:40 · 97 阅读 · 0 评论 -
python 排序(三)归并排序
一、介绍归并排序与快速排序都是利用了分治的策略基本原理与思想:1、将一个序列从中间位置分成两个序列2、将两个子序列重复第一步的操作,直到所有子序列长度为一3、将所有子序列进行归并,每两个序列比较第一个元素的大小,将小的拿出来二、代码实现def merger(a, b): c = [] h = j = 0 while j < len(a) ...原创 2019-09-27 09:19:50 · 241 阅读 · 0 评论 -
python 排序(二)堆排序
一、简介堆:堆栈是计算机的两种最基本的数据结构,堆的特点是先进先出,栈是后进先出。堆其实可以理解成树的结构。堆在接受数据时先接收的数据会被先弹出。栈处于一级缓存而堆处于二级缓存中。 堆是一颗顺序存储的完全二叉树,有大根堆和小根堆。 大根堆:每个结点的key不小于其孩子结点的key,反之则是小根堆堆排序的思想:本质是使用大根堆或小根堆来对一个数组进行排序操...原创 2019-09-26 16:41:44 · 141 阅读 · 0 评论 -
python 排序(一)快速排序、原理以及代码实现、比较归并排序、时间复杂度推算
一、介绍快速排序(quick sort)采用了分治的策略(很多排序都应用到分治,比如归并排序)。快速排序的基本思想就是:通过一趟排序将要排序的数据分隔成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。1、原理以及思想:(1)、将数据分为两步分,先在原数组选取一个数据做...原创 2019-09-26 14:06:19 · 344 阅读 · 0 评论