算法
茄子_土豆
生命不息,学习不止
展开
-
算法篇--链表求和
问题描述给两个链表,每个链表为一个整数的倒序,如下:1 - 2 - 34 -5 - 7- 9两个数字的结果:321+9754= 10075那么! 请得到 链表的结果为 5 - 7 - 0 - 0 - 1思考思路总结: 两个链表肯定有一个最长的(等于情况取哪个都行),所以两个链表相加时候就用 短的限制循环边界,跳出循环后则 遍历长的 相加几点注意:1 每两个节点相加时,也要加 上一次的进位信息2 当长的链表遍历后,注意进位信息的处理代码原创 2021-09-02 14:56:41 · 748 阅读 · 0 评论 -
希尔排序图解与代码
前言今天是学习排序算法的最后一个,小计一下,内心已经没有最初的畏难情绪,和排斥学习,信心在增强,一开始觉的很难,但是当过了某个点以后,特别是过了归并排序,快排后,觉得适应了很多,当然也可能是排序算是基础的算法,不管怎样后面加油吧。算法介绍希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序。希尔排序是非稳定排序算法。希尔排序因DL.Shell于1959年提出而得名。算法思想先用白话说描述,先排个大概近似的,有序数列,然后再次基础上在细分,排个近似有序原创 2021-08-13 11:41:22 · 861 阅读 · 1 评论 -
基数排序图解与代码
适用范围与背景前几天写了,计数排序,刚好学习基数排序,我认为基数排序是计数排序的一个补充或者说延伸,因为计数排序不适合,数列元素间差值较大的情况,而基数排序就解决了此情况,它适用于大整数排序。算法思想不像传统排序算法,两个元素间相互比较大小,进行排序,而是通过数列索引天然有序的特性来排序。一图胜千言:每一位的比较,都保留了上一次比较的结果,例如说: 当比较百位时, 那么前两个次 ,个位,和十位的比较的结果不会被破坏,可以看第三列,的结果所有百位以下的数字,是有序的。核心代码 @Test原创 2021-08-12 11:52:22 · 238 阅读 · 0 评论 -
计数排序动漫与代码
从复杂度较高的,冒泡排序,选择排序,插入排序(不包含二分插入排序) ,这些时间复杂度为 O(N^2) 的排序,再到归并排序,快速排序,堆排序, @Test public void counrtSort () { int[] arr = {2, 11, 1, 8, 7, 18, 18, 6, 5, 3, 20, 4}; System.out.println(Arrays.toString(arr)); int max = arr[0];原创 2021-08-11 09:33:10 · 131 阅读 · 0 评论 -
桶排序动态图与代码
感谢:https://www.geeksforgeeks.org/fundamentals-of-algorithms/?ref=shm#SearchingandSorting计数排序不能解决当数字有,小数的情况,但是桶排序算法做出了弥补。步骤实现:创建桶将元素放入桶每个桶里的元素,做好排序遍历所有桶,放入到结果数组中步骤实现的关键点通常情况下被排序的数组有几个元素我们就建几个桶元素怎么确定放入第几个桶,通过元素值*桶数 例如: arr[i] 放入桶里哪个同理? index原创 2021-08-09 19:55:23 · 1003 阅读 · 0 评论 -
归并排序动态图与代码
感谢: https://www.bilibili.com/video/BV1Ma4y1n7E2?from=search&seid=18386669306238899564采用分治的思想,递归调用,把复杂的逻辑,留个计算机去实现。 @Test public void test10() {//归并 int[] arr = {2, 11, 1, 8, 7, 18, 9, 0, 6, 5, 3, 20, 4}; int[] temp = new int[ar原创 2021-08-05 21:00:20 · 200 阅读 · 0 评论 -
选择排序动图与代码
顾名思义: 每次都选择一个最小(或最大),并依次在整个循环里比较,找到最小(或最大),叫选择排序 @Test public void choiceSort() { int[] arr = {2, 11, 1, 8, 7, 18, 9, 0, 6, 5, 3, 20, 4}; for (int i = 0; i < arr.length; i++) { int min = i; for (int j = i;原创 2021-08-05 20:33:18 · 112 阅读 · 0 评论 -
冒泡排序动态图与代码
两个两个比较,直到没有数可以交换的时候结束这个数,再到下个数,直到整个数组排好顺序。因一个个浮出所以叫冒泡排序。双重循环时间 O(n^2) @Test public void test2() {//冒泡int[] arr = {2, 11, 1, 8, 7, 18, 9, 0, 6, 5, 3, 20, 4}; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < ar原创 2021-08-05 20:13:25 · 381 阅读 · 0 评论 -
插入排序动态图与代码(二分插入与普通插入)
普通插入排序核心思想:脑海里要有个虚拟数组,从做往右,是个排好序的。具体做法,从第二个数字开始,每个数字都试图跟它前一个比较并做交换,并重复这个动作,直到前一个数不存在,或者,比他小,或者相等的时候停下来。 @Test public void insertSort(){ for (int i = 0; i < arr.length; i++) { int temp = arr[i]; for (int j = i-1原创 2021-08-05 20:02:26 · 692 阅读 · 0 评论 -
精简的LRU
hashMap + 双链表 实现注意:最巧妙在于 首尾节点,用一个无用的 节点,占位,(其实在AQS的队列里,就是这样的)好处是,当移除或者新增加节点时,程序不用考虑 首节点和尾节点的特殊情况,全部按照中间节点来操作。你品!你细品,!!!package com.leetcode.LRU;import lombok.Data;import java.util.HashMap;import java.util.Map;/** * @ClassName: LRUCache4 *原创 2021-04-10 11:50:31 · 61 阅读 · 0 评论 -
如何反转一个单链表java
目标:反转前1 -->2–>3–>4反转后4–>3–>2–>1思维思维关键点1 关键点一,本质最终的目的:改变为:两两相邻的节点,相对于,从前指向变相反方向。清晰的抓本质,箭头方向的改变,这样才能写出简单代码!2 关键点二 指针工具做算法,指针工具的巧妙借用,本题至少pre current next 三个变量的指针用的上,试想反转一个指针,一定是存在两个节点,才能有个指向链吧! 假设已知当前节点(current),那么就要考虑,指向当原创 2021-03-06 18:02:23 · 281 阅读 · 0 评论 -
快排 排序
package com.leetcode;import org.junit.Test;import java.util.Arrays;import static javafx.scene.input.KeyCode.R;/** * @ClassName: SortAlgorithm * @Description: * @Author fjp * @Date 2021/3/5-9:16 * @Version 1.0 */public class SortAlgorithm {.原创 2021-03-05 11:15:10 · 76 阅读 · 0 评论