算法
算法
芝諾de乌龟
这个作者很懒,什么都没留下…
展开
-
LeetCode - 300_最长上升子序列
题目描述给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例输入:[10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。思路Codepublic class Solution { public int lengthOfLIS(int[] nums)原创 2021-09-16 14:41:47 · 75 阅读 · 0 评论 -
排序算法 - 堆排序
思路把数组构造成一个大(或小)顶堆,最大(或最小)的值在最上面然后把堆顶和末尾元素交换,这样,最后一个元素就成了最大的(或最小的)然后对剩下的length-1个数再进行构建大顶堆,然后再交换,以此类推,直到剩下最后一个元素,则所有元素均排序完毕Codepublic class HeapSort { public void sort(int[] arr) { if (ArrayUtils.isEmpty(arr) || arr.length == 1) {原创 2021-08-26 22:23:15 · 90 阅读 · 0 评论 -
剑指Offer - 32-3_从上到下打印二叉树
题目描述请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。示例输入: 3 / \ 9 20 / \ 15 7输出:[ [3], [20,9], [15,7]]思路采用广度优先搜索,从头结点开始遍历,先把头结点添加进队列然后从队列取结点,取的数量为当前队列的大小,这些刚好都是同一层的节点然后依次把值添加进对应层的结果集中,然后判断当前节点有原创 2021-08-17 23:24:54 · 58 阅读 · 0 评论 -
剑指Offer - 32-1_从上到下打印二叉树
题目描述从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。示例输入: 3 / \ 9 20 / \ 15 7输出:[3,9,20,15,7]思路采用广度优先搜索,从头结点开始遍历,先把头结点添加进队列然后从队列取结点,值添加进结果集中,然后判断当前节点有没有左右结点,如果有,依次添加进队列以此类推,遍历队列,最后得到结果Codepublic class Solution { public int[] levelOrder原创 2021-08-17 23:22:51 · 48 阅读 · 0 评论 -
剑指Offer - 32-2_从上到下打印二叉树
题目描述从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。示例输入: 3 / \ 9 20 / \ 15 7输出:[ [3], [9,20], [15,7]]思路采用广度优先搜索,从头结点开始遍历,先把头结点添加进队列然后从队列取结点,取的数量为当前队列的大小,这些刚好都是同一层的节点然后依次把值添加进对应层的结果集中,然后判断当前节点有没有左右结点,如果有,依次添加进队列,然后把当前层的结果集添加进整体结果集原创 2021-08-17 23:23:54 · 79 阅读 · 0 评论 -
剑指Offer - 30_包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回 0.m原创 2021-08-16 23:44:26 · 76 阅读 · 1 评论 -
LRU算法
思路如果缓存中的值被访问就移到最前面如果缓存满了,仍在添加值,那么移除尾部的值,然后再添加值到头部使用哈希表+链表实现Codepublic class Node<V> { String key; V value; Node<V> prev; Node<V> next; public Node() { } public Node(String key, V value) { this.原创 2021-08-09 23:50:10 · 54 阅读 · 0 评论 -
剑指Offer - 25_合并两个排序的链表
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路因为两个链表是有序的,所以同时遍历两个链表,找到值小的一个放到结果链表的最后,然后再让值小的结点指向后继节点依次类推,直到其中一个链表遍历结束,则剩余的链表的值肯定都大于等于结果链表的最后一个节点的值就直接把剩余链表添加到结果链表的最后最后返回结果链表的头节点即可原创 2021-08-04 21:23:56 · 60 阅读 · 0 评论 -
剑指Offer - 24_反转链表
题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL思路采用快慢指针方法,快指针从头开始遍历,慢指针比快指针慢一个结点(初始化是null)把快指针的后继结点向它前驱结点,也就是慢指针处结点,然后再让慢指针指向快指针,快指针指向原来的后继节点这样就做到了一个反转,然后依次遍历,直到遍历结束则反转结束最后返原创 2021-08-04 21:09:05 · 108 阅读 · 0 评论 -
剑指Offer - 22_链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例输入: 1->2->3->4->5, k = 2.返输出:4->5.思路采用快慢指针,先上快指针找到第k个位置,当在寻找第k个时,如果出现了null,那直接返回null快指针指向第k个,慢指针指向头结原创 2021-08-02 21:48:20 · 68 阅读 · 0 评论 -
剑指Offer - 21_调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例输入:nums = [1,2,3,4]输出:[1,3,2,4] 思路采用快慢指针,慢指针指向奇数应该存放的位置,快指针遍历数组当快指针找到奇数时,和慢指针替换位置,然后慢指针+1,继续遍历直到快指针遍历结束Codepublic class Solution { public int[] exchange(int[] nums) {原创 2021-08-02 21:47:26 · 49 阅读 · 0 评论 -
剑指Offer - 18_删除链表的节点
题目描述给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。示例输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.思路定义两个指针,一个为前驱结点,一个为真正要遍历和判断的结点如果找到相等的,直接让前驱结点的下一个结点指向当前遍历节点的下一个结点即可最后返回头结点Cod原创 2021-08-01 22:19:18 · 65 阅读 · 0 评论 -
剑指Offer - 13_机器人的运动范围
题目描述地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例输入:m = 2, n = 3, k = 1输出:3思路深度优先搜索(DF原创 2021-07-27 21:46:43 · 85 阅读 · 1 评论 -
剑指Offer - 12_矩阵中的路径
题目描述给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。示例输入:board = [["A","B","C","E"],["S","F","C","S"],["A","原创 2021-07-25 00:09:02 · 64 阅读 · 0 评论 -
剑指Offer - 11_旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 示例输入:[3,4,5,1,2]输出:1思路可以根据数组的旋转处索引把数组拆成两个有序数组,那么左边数组的任意一个值都大于等于右边数组中任意一个那么就可以采用二分法进行寻找最小值假设左右两端的索引分别为start和end,中间索引为mid=原创 2021-07-20 23:35:32 · 56 阅读 · 0 评论 -
剑指Offer - 10-2_青蛙跳台阶问题
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例输入:n = 2输出:2思路每次只能跳1级或者2级,那么在最后一次的时候,就有两种可能,跳1级或者2级到顶,那么假设跳n级一共有F(N)种可能如果最后一次加入跳1级,那剩下的N-1级就有F(N-1)种可能;如果最后一次加入跳2级,那剩下的N-2级就有F(N-2)种可能原创 2021-07-19 23:38:23 · 155 阅读 · 2 评论 -
剑指Offer - 10-1_斐波那契数列
题目描述写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例输入:n = 2输出:1思路递归:把F(N)拆分成F(N-1原创 2021-07-19 23:21:41 · 96 阅读 · 0 评论 -
剑指Offer - 09_用两个栈实现队列
题目描述用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]思路维护两个栈,一个只负责进,一个只负责出因为栈先进后出,所以对第一个栈的原创 2021-07-18 22:21:59 · 48 阅读 · 0 评论 -
剑指Offer - 07_重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。示例输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]输出: [3,9,20,null,null,15,7]思路二叉树遍历顺序:前序遍历:根节点 -> 左节点 -> 右节点中序遍历:左节点 -> 根节点 -> 右节点所以二叉树遍历结果可以拆分为:前序遍历:[根节点原创 2021-07-18 21:38:16 · 62 阅读 · 0 评论 -
剑指Offer - 06_从尾到头打印链表
题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例输入:head = [1,3,2]输出:[2,3,1]思路校验链表,如果为null直接return空数组定义一个LinkList存储链表中的val,定义临时结点temp指向head遍历链表,直到temp为null,把每个节点的值val添加进LinkList中(默认都是添加到最后一个)顺序遍历LinkList,每次都移除最后一个,并添加到结果数组到当前遍历的索引处,最终返回结果数组Codepublic原创 2021-06-22 22:33:26 · 44 阅读 · 1 评论 -
剑指Offer - 05_替换空格
题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例输入:s = "We are happy."输出:"We%20are%20happy."思路校验字符串为空,直接return ""定义StringBuilder存储结果,然后遍历字符串判断当前字符是不是和“ ”相等,如果相等result添加%20,否则添加当前字符最后把result转为字符串输出Codepublic class Solution { public String replaceSpac原创 2021-06-22 22:32:04 · 46 阅读 · 0 评论 -
剑指Offer - 04_二维数组中的查找
题目描述在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回原创 2021-05-16 18:52:57 · 56 阅读 · 0 评论 -
剑指Offer - 03_数组中重复的数字
题目描述在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3思路数组校验,校验不通过直接抛出一样定义Set用来存储数组已经遍历过得数字,为numberSet遍历数组,如果numberSet中包含当前数字,直接return当前数字,否则添加当前数字到numberSet中如果遍历结束,还原创 2021-05-16 18:17:39 · 45 阅读 · 0 评论 -
LeetCode - 003_无重复字符的最长子串
题目描述给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是"abc",所以其长度为3。思路定义一个常量存放最长不重复字符串长度,一个常量存放不重复字符索引,一个map存放字符和对应索引遍历字符串判断当前字符在map中是否存在,如果存在,取左边字符索引+1和指针索引大的一个把当前字符和索引存入map中判断当前字符索引到不重复索引的长度和最长长度,取大的Codepublic class原创 2021-03-17 23:29:25 · 69 阅读 · 0 评论 -
LeetCode - 002_两数相加
题目描述给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。示例输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.思路定义一个头结点,以及l1、l2、头结点的临时结点,定义一个变量存放进位遍历两个临时链表,终止条件为两个临时链表的当前节点都为空求出进位和两原创 2021-03-16 23:40:47 · 58 阅读 · 0 评论 -
LeetCode - 001_两数之和
题目描述给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值的那两个 整数,并返回它们的数组下标。示例输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。思路定义一个map,key为数组的值,value为值对应的索引遍历数组,判断目标值减当前索引处值是否在map中存在的如果存在,直接返回相减后值的对应索引和当前索引不存在,则把当前值和对应索引添原创 2021-03-16 23:39:58 · 108 阅读 · 0 评论