![](https://img-blog.csdnimg.cn/20190719171831987.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法学习
文章平均质量分 67
根据学习数据结构与算法之美所做笔记,打铁还需自身硬,数据结构与算法就是美好明天的奠基石
ProMan_XY
这个作者很懒,什么都没留下…
展开
-
剑指Offer-学习计划(八)查找算法(下)
考点:关于查找算法,分类其实还挺多的,比如二分查找,顺序查找,插值查找,树表查找,哈希查找等,实际上日常编码也会接触到,可以借用他们的思想给我们的编码过程带来更好的体验,这几道题里面最多的用到的就是二分、顺序和哈希了,顺序和哈希一般考点不会太深主要是二分查找。注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。原创 2023-08-28 12:30:00 · 107 阅读 · 0 评论 -
剑指Offer-学习计划(七)查找算法(上)
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。解法三:数据结构解法标答,用解法二和三都可以,让人知道你会用算法和结构解决问题。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。剑指 Offer 53 - II. 0~n-1中缺失的数字。输入: [0,1,2,3,4,5,6,7,9]原创 2023-08-22 11:55:04 · 213 阅读 · 0 评论 -
剑指Offer-学习计划(六)模拟
例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。输出:[1,2,3,4,8,12,11,10,9,5,6,7]输出:[1,2,3,6,9,8,7,4,5]原创 2023-08-11 17:43:45 · 289 阅读 · 0 评论 -
剑指Offer-学习计划(五)栈与队列
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。解法:这道题很简单,首先把我们常用的Node节点实现出来,之后按照所需方法逐个实现即可,注意节点里面该有的val,min,next这些都要有。2. 他们也是源自数组和链表的一种延伸结构,比如数组实现的栈成为顺序栈,链表实现的栈成为链式栈。1. 栈和队列本身都属于限制型的数据结构,有各自的定义,也有可以混淆的部分。队列的声明如下,请实现它的两个函数。原创 2023-08-04 10:08:14 · 146 阅读 · 0 评论 -
剑指Offer-学习计划(四)双指针(下)
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。例如输入字符串"I am a student. ",则输出"student. a am I"。输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。输入:nums = [10,26,30,31,47,60], target = 40。输入:nums = [2,7,11,15], target = 9。原创 2023-07-28 10:51:36 · 371 阅读 · 0 评论 -
剑指Offer-学习计划(三)双指针(上)
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3。输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。原创 2023-07-20 11:39:28 · 82 阅读 · 0 评论 -
剑指Offer-学习计划(二)链表篇
考点:1. 链表的考点太多了主要就是玩指针,指针明白了就没啥可看的2. 双指针也可以算是指针的经典算法,虽然也能玩数组吧3. 可以套用一些现有的结构处理比较复杂的问题,比如LinkedList之类的题目一:从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:[2,3,1]解法一:求个长度用来newArray,之后顺序遍历链表 ,数组反向接收即可不愿意循环求长度也可以直接上List转成数组=null){len++;=null){原创 2023-07-13 11:32:50 · 164 阅读 · 0 评论 -
剑指Offer-学习计划(一)字符串篇
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 2: 输入: s = "lrloseumgh", k = 6 输出: "umghlrlose"示例 1: 输入: s = "abcdefg", k = 2 输出: "cdefgab"解法一:去除字符串隐患,之后转换Float,因为可能包含浮点数。解法二:去掉首位空格后对字符串判断合法性,去伪存真。题目二:左旋转字符串。原创 2023-07-11 10:03:36 · 230 阅读 · 0 评论 -
LeetCode用两个栈实现队列(Java)
用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )示例 1: 输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:["CQueue","deleteHead","appen..原创 2020-10-24 11:05:42 · 6357 阅读 · 0 评论 -
Java基数排序代码实现
public static void radixSort(int []a,int n){ if (n<=1)return; int max = a[0]; for (int i=0;i<n;i++){ if (max<a[i])max = a[i]; } for (int...原创 2020-02-14 18:03:09 · 9886 阅读 · 0 评论 -
Java桶排序代码实现
public static void bucketSort(int [] a,int bucketSize){ if (a.length<2)return; int minIndex = a[0]; int maxIndex = a[1]; for (int i=0;i<a.length;i++){ ...原创 2020-02-14 18:02:31 · 10038 阅读 · 0 评论 -
Java堆的实现和堆排序
public class Heap { private int[] a; // 数组,从下标1开始存储数据 private int n; // 堆可以存储的最大数据个数 private int count; // 堆中已经存储的数据个数 public Heap(int capacity) { a = new int[capacity + 1]...原创 2020-02-02 14:09:12 · 9962 阅读 · 0 评论 -
Java基于数组实现的LRU缓存
public class LRUBasedArray<T> { private static final int DEFAULT_CAPACITY = (1 << 3); private int capacity; private int count; private T[] value; private Map<T...原创 2020-01-18 17:53:29 · 10343 阅读 · 0 评论 -
Java HashTable实现
HashTable实现/** * @Description:散列表实现 */public class HashTable<K, V> { /** * 散列表默认长度 */ private static final int DEFAULT_INITAL_CAPACITY = 8; /** * 装载因子 */...原创 2020-01-11 15:30:01 · 9908 阅读 · 0 评论 -
转载~时间复杂度分析(个人强推)
这些都是算法时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。O(1)解析O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标...转载 2020-01-01 13:58:16 · 9723 阅读 · 0 评论 -
Java队列的几种实现(循环队列,阻塞队列,顺序队列,链式队列)
顺序队列public class ArrayQueue { // 数组:items,数组大小:n private String[] items; private int n = 0; // head表示队头下标,tail表示队尾下标 private int head = 0; private in...原创 2019-12-29 16:08:03 · 10152 阅读 · 0 评论 -
数据结构与算法分析(十二)散列表
散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash 表” 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。 散列表的由来? 散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。 需要存储在散列表中的数据我们称为键,将键转化为...原创 2019-11-27 15:57:49 · 9801 阅读 · 0 评论 -
数据结构与算法分析(十一)跳表
跳表(Skip list): 它是一种各方面性能都比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(Red-black tree) Redis 中的有序集合(Sorted Set)就是用跳表来实现的。 对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,...原创 2019-11-27 15:50:11 · 9919 阅读 · 1 评论 -
链表复习(二)
工作好辛苦!!!!数组 链表性能比拼 不能局限于时间复杂度,在实际开发中,不能仅用复杂度分析来决定使用哪个数据结构来存储数据 数组简单易用,在实现上使用的是连续的内存空间,可以借助CPU的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对CPU缓存不友好,没办法有效预读 数组的缺点是大小固定,一经声明就要占用整块连续内存空间。如果声明的数组过大,系统可能没...原创 2019-10-28 11:32:56 · 8962 阅读 · 0 评论 -
链表复习(一)
链表的经典应用场景:LRU缓存淘汰算法 决定缓存淘汰的三种策略:先进先出FIFO、最少使用策略LFU、最近最少使用策略LRU 书房清理书籍与缓存淘汰策略相同 链表和数组的区别 数组需要一块连续的内存空间存值,对内存的要求高。如果申请100MB,可是内存中没有连续的足够的存储空间,即便剩余内存大于100MB还是会申请失败 链表并不需要一块连续的内存空间,他通过“指针”将一组零散的内存块串联...原创 2019-10-24 10:14:03 · 9018 阅读 · 0 评论 -
数组精简复习
ArrayList初始容量为10 扩容后的大小 = 原始大小+原始大小的1/2(jdk各个版本不一致) LinkedList是一个双向链表,没有初始化大小,也没有扩容机制,可以一直在前面或者后面新增就行 HashMap初始化大小是16,扩容因子默认0.75 数组从0开始编号 数组可以随机访问 数组是一种线性表数据结构,他用一组连续的内存空间,来存储一组具有相同类型的数据 线性表。就是数...原创 2019-10-21 17:24:00 · 8836 阅读 · 0 评论 -
数据结构与算法分析(四)链表
一、什么是链表?1.和数组一样,链表也是一种线性表。2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。3.链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。二、为什么使用链表?即链表的特点1.插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率低O(n...原创 2019-08-17 11:28:20 · 8088 阅读 · 0 评论 -
数据结构与算法分析(八)排序(冒泡,插入,选择)
一、几种经典排序算法及其时间复杂度级别冒泡、插入、选择 O(n^2) 基于比较快排、归并 O(nlogn) 基于比较计数、基数、桶 O(n) 不基于比较二、如何分析一个排序算法?1.学习排序算法的思路?明确原理、掌握实现以及分析性能。2.如何分析排序算法性能?从执行效率、内存消耗以及稳定性3个方面分析排序算法的性能。3.执行效率:从以下3个方面来衡量1)最好情况、最坏情况、平均情况时...原创 2019-08-17 11:22:29 · 7919 阅读 · 0 评论 -
数据结构与算法分析(七)递归
一、什么是递归?1.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。2.方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。3.基本上,所有的递归问题都可以用递推公式来表示,比如f(n) = f(n-1) + 1;f(n) = f(n-1) + f(n-2);f(n)=n*f(n-1);二、为什么使用递...原创 2019-08-07 19:28:13 · 7876 阅读 · 0 评论 -
数据结构与算法分析(三)数组练习代码
package com.example.demo.array;public class Brray { public int data[];//数组数据空间 private int n;//数组长度 private int count;//实际元素个数 //构造方法定义数组大小 public Brray(int capacity) { ...原创 2019-07-24 14:43:31 · 7669 阅读 · 0 评论 -
数据结构与算法分析(三)数组
为什么数组是从0开始不是从1开始呢 什么是数组?数组(Array)是一种线性表数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据 第一个是线性表(LinearList)线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。除了数组,链表、队列、栈等等也是线性表结构 与线性表对立的概念是非线性表,比如二叉树、堆、图等等。之所以叫非线性,是因为,在非线性表...原创 2019-07-20 22:50:13 · 7623 阅读 · 2 评论 -
数据结构与算法分析(二)复杂度分析
总结一、什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。二、为什么要进行复杂度分析?1.和性能测试相比,复杂度分析有不依赖执行环境、成本低、...原创 2019-07-20 13:01:35 · 7999 阅读 · 0 评论 -
数据结构与算法分析(一)基础
什么是数据结构?什么是算法?广义:数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。例子:图书馆存储图书,为了方便查找,图书管理员一般会将书籍分门别类进行存储。按照一定规律编号,就是书籍这种“数据”的存储结构。我想找一本书?可以有很多种方法,我可以一本一本的找,也可以根据书籍类别编号,是军事,还是政治、人文,来定位书架,然后再依次查找,这些查找的方法都是算法。狭义...原创 2019-07-19 18:32:45 · 7651 阅读 · 1 评论