数据结构与算法
文章平均质量分 74
everyD_struggle
任重而道远
展开
-
算法 - 加油站
leetcode_134在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。示例 1:输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]输出:原创 2022-02-17 23:10:07 · 299 阅读 · 0 评论 -
算法 - 链表相关
文章目录链表定义反转链表迭代迭代栈寻找链表的中点合并链表重排链表环形链表链表定义/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) {原创 2022-02-21 22:35:47 · 413 阅读 · 0 评论 -
算法 - 神奇的异或
文章目录什么是异或?使用经验1.数组中的单一元素2.数组中的单一元素(进阶)3.有序数组中的单一元素什么是异或?同0异1。在java内就是X^Y。任何数异或0为任何数 0 ^ n = n任何数异或1,n为奇数,n^ 1 = n-1;n为偶数 n^1=n+1相同的数异或为0: n ^ n = 0使用经验1.数组中的单一元素给你一个仅由整数数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。1 <= nums.length <= 10^原创 2022-02-14 22:27:47 · 1055 阅读 · 0 评论 -
算法 - 众数(摩尔投票)
找出数组中大于出现频率大于n/2的数方法一:hashmap,排序等,这种常规思路就不概述方法二:摩尔投票不同的两数相互抵消,最后剩下的肯定是多于一半的那个数。当count为0时,选举当前为最多的数,并++,不为选举最多的数的使count–。最终一定是candidate是最多的数,但条件是出现频率必须大于数组长度的一半。 public int majorityElement(int[] nums) { int count = 0; Integer candidate原创 2021-03-26 15:11:18 · 207 阅读 · 0 评论 -
算法 - 二分查找
基础二分 /** * 要求数组有序 ,二分法 * @param arr * @param * @return */ private static int binarySearch(int[] arr, int left, int right, int findVal) { //给一个出口 if (left >= right) { return -1; }原创 2021-03-26 13:53:10 · 90 阅读 · 0 评论 -
算法 - 链表与图的深拷贝
链表深拷贝leetcode 138给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.ran原创 2021-03-25 16:18:18 · 259 阅读 · 0 评论 -
算法 - 回文相关
文章目录1.判断是否回文2.最长回文子串3.分割回文串4.最短回文串Manacher 算法 O(n)KMP算法1.判断是否回文双指针做法的时间复杂度是 O(N),优化的解法是,先采用动态规划,把回文子串的结果记录在一个表格里。 /** * * @param charArray * @param left 子串的左边界,可以取到 * @param right 子串的右边界,可以取到 * @return */原创 2021-03-24 16:44:58 · 213 阅读 · 0 评论 -
数据结构 - lru&lfu实现(Java)
文章目录1. LRU 基于哈希表和双向链表的LRU算法实现2. LFU(LinkedHashSet)LRU与LFU的区别1. LRU 基于哈希表和双向链表的LRU算法实现缓存看这篇LinkedHashMap的LRUCache实现设计思路是,使用哈希表存储 key,值为链表中的节点,节点中存储值,双向链表来记录节点的顺序,头部为最近访问节点。LRU算法中有两种基本操作:get(key):查询key对应的节点,如果key存在,将节点移动至链表头部。set(key, value): 设置key对原创 2020-12-08 18:31:38 · 1196 阅读 · 0 评论 -
排序算法 - 归并&快排
文章目录1. 归并排序借助额外空间和并空间优化2. 快速排序递归写法非递归写法性能改进1. 归并排序平均时间复杂度:O(nlogn)最佳时间复杂度:O(n)最差时间复杂度:O(nlogn)空间复杂度:O(n)排序方式:In-place稳定性:稳定归并排序的思想就是将问题细分成小问题,最后将容易的小问题汇集就解决了全局的问题。一句话来说,局部有序 ·合并· 成全局有序。借助额外空间和并写归并排序建议先从合并写起,我们的基础条件就是将两个有序的数组合并成一个大数组,且这个大数组在合并过程原创 2020-12-03 22:16:04 · 540 阅读 · 0 评论 -
数据结构 - 两个栈实现一个队列
实现原理栈的特性是先进后出,队列的特性是先进先出。那么,我们使用两个栈,对同一个元素进行先进后出两次栈就形成了先进先出的顺序。即一个元素需要入栈两次,才能被取出来。我们将put,get定义为存放元素,与取元素。使用命名为in,out的栈,in代表往队列里面put元素第一次入栈是进入in,out代表get元素是从out这个栈里取。第一次,get时out为空,需要从in中取元素,以形成正序取。其内部实现细节如下:put(){ in.put;}get(){//如果out为空,则从in原创 2020-12-03 14:06:46 · 209 阅读 · 0 评论 -
算法-最快速度求两个数组之交集算法
1. DSU(并查集)条件:需要查询小范围的数据集合,不包含特殊数字。同时数字>=1。思路:使用数组hash。index代表集合中的数。value为代表集合。 class DSU { int[] parent; //可初始化大小 public DSU() { parent = new int[10001]; for (int i = 0; i <= 10000; ++i)原创 2020-09-13 09:53:29 · 2841 阅读 · 0 评论 -
排序算法 - 希尔排序(插入)
排序算法概览插入排序工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 /** * 插入排序原理:寻找未排序后的第一个位置,插入已排序中的对应位置 */ public void insertSort(int[] arr) { int length原创 2020-09-06 09:40:05 · 335 阅读 · 0 评论 -
leetcode-回溯问题总结(DFS)
1.DFS图论里邻接表的DFS private void dfs(boolean[] isVisited, int i) { //将结点设置为已经访问 isVisited[i] = true; //查找结点i的第一个邻接结点w int w = getFirstNeighbor(i); while(w != -1) {//说明存在当前临界点 if(!isVisited[w]) {原创 2020-05-12 14:20:50 · 844 阅读 · 0 评论 -
数据结构总结- 树相关
参考:https://blog.csdn.net/qq_25343557/article/details/89110319https://zhuanlan.zhihu.com/p/27700617文章目录AVL树LL(右旋)RRB树B+树B\*树红黑树HuffMan树AVL树在二叉树的基础上改进的,防止出现以下情况定义: 平衡二叉搜索树(Self-balancing bin...原创 2020-04-22 16:34:22 · 226 阅读 · 0 评论 -
深入理解并发编程-阻塞队列
本文为读书笔记,<<java并发编程的艺术>>文章目录1. 什么是阻塞队列?2.介绍java里的阻塞队列2.1 ArrayBlockingQueuetodo1. 什么是阻塞队列?2.介绍java里的阻塞队列ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。Pri...原创 2020-04-19 21:59:56 · 266 阅读 · 0 评论 -
java-词法分析器的设计与实现(编译原理)(标识符机内码实现)
1.机内码应该的特点:一个标识符对应一个机内码相同标识符对应一个机内码2.设计思想:基于java语言的hashmap结构:3.Java hashmap的特点:存储时:他们会找到相同的bucket位置,发生碰撞,因为HashMap使用链表存储对象(每个Map.Entry都有一个next指针),这个Entry会存储在链表中。获取时:会用hashCode找到bucket位置,然后调...原创 2020-04-13 22:05:31 · 1614 阅读 · 0 评论 -
临界矩阵与邻接表实现图的广度深度遍历
只是把自己学的发一下,代码可以直接copy直接跑广度优先遍历类似于一个分层搜索的过程,广度优先遍历需要使用一个队列以保持访问过的结点的顺序,以便按这个顺序来访问这些结点的邻接结点。具体算法表述如下:访问初始结点v并标记结点v为已访问。结点v入队列当队列非空时,继续执行,否则算法结束。出队列,取得队头结点u。查找结点u的第一个邻接结点w。若结点u的邻接结点w不存在,则转到步骤...原创 2020-03-07 19:24:52 · 563 阅读 · 0 评论 -
数据结构与算法-排序&查找
冒泡排序将最大的每一轮放到最右边 /** * 冒泡排序 *O(n^2) * @param arr * @return */ public static void bubbleSort(int[] arr) { int count = 0;//交换次数 for (int i = 0; i < ar...原创 2020-02-28 17:55:40 · 196 阅读 · 0 评论