算法总结
ZZYSY~
这个作者很懒,什么都没留下…
展开
-
链表相交(Java)
思路:设A链表长度为a,B链表长度为b,两个链表的交集长度为c,那么从A链表头结点开始,走完自己一遍之后,再走B链表,走到相交结点,需要的步数为a + (b - c),同样,对于B链表,从头结点开始,走完自己一遍,再走A链表,走到相交结点,需要的步数为b + (a - c),可以发现,a + (b - c) = b + (a - c),所以,让他们同时开始走,如果有相交结点,总会相遇的,而相遇时共同指向的那个结点就是相交结点,如果没有相交结点,那他们就会把两个链表都走完,最终全是null,两种情况最后只.原创 2022-03-12 14:33:10 · 1264 阅读 · 0 评论 -
二叉树的最大深度(Java)
思路:通过递归搜索每个结点的左右孩子,如果左子树或右子树不为空,深度就加1,然后和当前的最大深度比较,如果大就替换最大深度,直到遍历完整棵树代码:class Solution { int maxHigh = 0; public int maxDepth(TreeNode root) { if(root == null) return 0; getHigh(root,0); return maxHigh; } public.原创 2022-02-06 22:05:47 · 538 阅读 · 0 评论 -
缓存淘汰算法——LRU算法详细总结及代码实现
什么是LRU算法?LRU是一种缓存淘汰策略,对于我们的计算机来说,缓存容量是有限的,那么当缓存满了要怎么办?这时就要用到LRU,对于很久没有用过的数据,我们可以将其判定为无用的数据,当新资源进入缓存或者用到了某个数据的时候,对应的资源可以判定为有用的数据,当缓存满了时我们应当优先淘汰无用的数据,而对于最近使用过的数据应当靠后淘汰,这就是LRU算法。和手机后台一样,我们会优先杀掉自己很久没用的后台,而常用的则不会杀掉它,甚至还会上锁实现思路设计一个LRUCache数据结构,有put和get方法,并且原创 2022-02-03 22:30:40 · 2811 阅读 · 0 评论 -
全排列(Java)
思路:回溯法,终止条件为List长度为数组长度,使用数组标记当前下标是否已经被使用,回溯时remove一次List并使标记数组在当前下标下的状态为未使用代码:class Solution { //用来存放大结果 List<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> permute(int[] nums) { //调.原创 2022-01-24 23:47:37 · 164 阅读 · 0 评论 -
螺旋矩阵(Java)
思路:①初始化:定义4个变量代表上下左右的边界,初始值依次为0,matrix.length,0,matrix[0].length,这里为了方便用up,down,left,right表示②遍历(for循环):向右:i=left,i<=right,存放matrix[up][i],遍历完毕后up++向下:i=up,i<=down,存放matrix[i][right],遍历完毕后right–向左:i=right,i>=left,存放matrix[down][i],遍历完毕后down–.原创 2022-01-24 23:36:54 · 289 阅读 · 0 评论 -
三步问题(Java)
思路:该题类似爬楼梯问题,只不过爬楼梯是只能爬1阶和2阶,这个小孩还能爬3阶,而且题目中为了防止溢出还让结果%1000000007,所以状态转移方程为dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007。注意,因为结果比较大所以要使用long来存放数据,否则,你懂的代码:class Solution { public int waysToStep(int n) { long[] dp = new long[n + 1]; if(.原创 2022-01-23 23:14:00 · 176 阅读 · 0 评论 -
复原IP地址(Java)
根据题目描述,我们可以得到以下几个信息要把字符串划分为四个段,不能多用不能少用每个段必须要在0~255这个范围内每个段都不能包含前导0要将所有的ip地址都找到分析:对于整个字符串,每个段都有三种情况,分别是1位,2位,3位,而如果我们决定了某个段要用几位字符串,又可以从这一情况出发延伸出下一段的三种情况,直到把我们的字符串分成四段并且每一位都用完为止,对此,我们可以采用回溯法得到各种情况,对不满足条件的情况舍弃,满足条件的放到ArrayList中。图解:可以看到,对于101023这个字.原创 2022-01-17 23:30:01 · 686 阅读 · 0 评论 -
使用数组实现栈结构(Java)
public class StackDemo <E> { //arr用来存放栈元素 private E[] arr = (E[]) new Object[20]; //index用来表示栈元素的数量 private int index = 0; //入栈 private void add(E e){ //栈满,扩充栈 if(index == arr.length){ E[] arr1 = (E[]) new原创 2022-01-13 15:01:20 · 76 阅读 · 0 评论 -
链表头插法和尾插法(Java)
头插法class Node{ int value; Node next; @Override public String toString() { return "Node{" + "value=" + value + ", next=" + next + '}'; }}public class Test { public static vo原创 2022-01-13 14:54:28 · 308 阅读 · 0 评论 -
判断链表是否有环(Java)
快慢指针,如果有环,两指针一定会相遇注意:①空链表和一个元素的链表直接返回false②如果没环,快指针一定会先到null,所以只需判断快指针是否为null③注意空指针异常,快指针的next也要判断是否为nullpublic class Solution { public boolean hasCycle(ListNode head) { if(head == null || head.next == null) return false; ListNode.原创 2022-01-12 21:08:56 · 1145 阅读 · 0 评论 -
有序数组的平方(Java)
暴力法:使用Math.pow函数平方或者直接nums[i]*nums[i],Arrays.sort函数排序,时间复杂度为O(n+nlogn)class Solution { public int[] sortedSquares(int[] nums) { for(int i = 0;i < nums.length;i++){ // nums[i] = nums[i]*nums[i]; nums[i] = (int)Math.pow.原创 2022-01-10 16:52:45 · 566 阅读 · 0 评论 -
买卖股票的最好时机(Java)
第一种想到的方法时暴力法,果不其然,超时了。。。class Solution { public int maxProfit(int[] prices) { int money = 0; int maxMoney = 0; for(int i = 0;i < prices.length - 1;i++){ for(int j = i + 1;j < prices.length;j++){ .原创 2022-01-10 16:07:23 · 278 阅读 · 0 评论 -
最小路径和(Java)
初始化:使用dp[i][j]表示从i,j坐标到右下角的最小路径状态转移方程:dp[i][j] = grid[i][j] + Math.min(dp[i + 1][j],dp[i][j + 1]);注意:①当i=high-1时,只能向右走②当j=width-1时,只能向下走③当i=high-1&&j=width-1时,dp[i][j]=grid[i][j]代码:class Solution {public int minPathSum(int[][] grid) { .原创 2022-01-09 16:15:22 · 322 阅读 · 0 评论 -
岛屿的最大面积(Java)
该题与岛屿数量这道题类似,思路也差不多,可去岛屿数量这篇文章中看看思路和代码。思路:该题的思路就是在岛屿生成函数createIsLands中添加area参数,每次生成一个小岛屿就加1,递归调用自身,直到生成一个大岛屿,返回area,这个area就是这个大岛屿的面积,然后与当前最大面积比较,哪个大哪个是最大面积,遍历完整个二维数组之后,就可以得到岛屿的最大面积了代码:class Solution { public int maxAreaOfIsland(int[][] grid) { .原创 2022-01-09 15:32:09 · 853 阅读 · 0 评论 -
打家劫舍(Java)
动态规划dp[i] = max(dp[i - 2] + nums[i],dp[i - 1])class Solution { public int rob(int[] nums) { if(nums.length == 1) return nums[0]; int dp[] = new int[nums.length]; dp[0] = nums[0]; dp[1] = Math.max(nums[0],nums[1]); .原创 2022-01-08 16:13:52 · 209 阅读 · 0 评论 -
汉诺塔问题(Java)
思路:将A中的前n-1的圆盘放到B中,(此时A为源柱,B为目的柱)将A中最后一个圆盘放到C中,(此时A为源柱,C为目的柱)将B中的n-1个圆盘放到C中。(此时B为源柱,C为目的柱)分析:利用递归即可,用到java中list的add,remove,size方法等代码:class Solution { public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) { .原创 2021-09-08 19:36:51 · 89 阅读 · 0 评论 -
岛屿数量(Java)
分析:把1当成陆地,0当成海,简单来说只要上下左右如果是1的话就可以看成一个陆地,从示例中也可以很清楚的看懂。思路:用一个和grid大小一样的整型二维数组arr来代表岛屿的生成过程,遍历grid,如果遇到grid[i][j]=‘1’&&arr[i][j]=0(前者代表这是块陆地,后者表示要在arr中生成这块陆地),进入岛屿生产函数createIsLands,createIsLands函数首先要在arr中生成岛屿即arr[i][j]=1,然后判断这块岛屿的上下左右是否满足之前那个条件,.原创 2022-01-08 15:48:50 · 1544 阅读 · 0 评论 -
跳跃游戏(Java)
从后往前遍历,如果a[i] = 0,就说明一定要跳过这个0,否则不可能到达最后,遍历i下标之前的下标j,如果找不到a[j] > i - j,就说明跳不过这个0,返回false。注意:①当数组长度为1时,直接renturn true②当数组长度大于1并且a[0]=0时,直接return false③从后往前遍历时,第一个遍历的元素为倒数第二个元素class Solution { public boolean canJump(int[] nums) { if(nums..原创 2022-01-08 14:54:07 · 2778 阅读 · 0 评论 -
二叉树的层次遍历(Java)
原理每一层从左到右依次遍历,需要用到队列(先进先出)实现public static void ceng(Node tree){ Queue<Node> queue = new LinkedList<>(); Node node; if(tree == null) { return; } queue.add(tree); while (!queue.isEmpty()){ node = queue.原创 2022-01-04 15:14:34 · 441 阅读 · 0 评论 -
二叉树的前中后序遍历(Java)
前序:根左右中序:左根右后序:左右根解题思路:先访问左子树,再访问根结点,最后访问右子树,对于访问左子树和右子树的时候,同样以这样的方式访问,需要使用递归的方法访问整棵树。首先定义存储访问顺序的List对象,因为使用递归的时候不能一直定义List对象,所以需要写一个inorder方法,对于inorder方法,首先以左子树为参数递归调用,再将根结点的值存储到List中,最后再以右子树为参数递归调用。注意:应判断根结点、左子树和右子树是否为null,否则会产生空指针异常。前序遍历和后序遍历于中序.原创 2021-08-26 20:34:49 · 93 阅读 · 0 评论 -
反转链表(Java)
背过就行????class Solution { public ListNode reverseList(ListNode head) { if(head == null){ return null; } ListNode L1 = null; ListNode L2 = null; while(head != null){ L1 = head.next;原创 2021-10-14 16:23:09 · 103 阅读 · 0 评论 -
二分查找算法(Java)
原理对于一个升序数组,使用中间数可以判断目标数可能在前半段和后半段,如果不在前半段就去后半段找,否则去前半段找,一直使用中间数查找,直到找到目标数。实现class Solution { public int search(int[] nums, int target) { int left = 0; int right = nums.length - 1; while(left <= right){ int mid原创 2022-01-04 15:07:09 · 507 阅读 · 0 评论 -
八大排序算法整理(Java)
目录关系复杂度插入排序原理实现选择排序原理实现冒泡排序自己的理解时间复杂度分析原理实现快速排序自己的理解时间复杂度分析原理实现数组实现链表实现基数排序原理实现希尔排序原理实现归并排序自己的理解时间复杂度分析原理实现堆排序(使用到了完全二叉树)自己的理解时间复杂度分析原理实现关系复杂度插入排序原理记录数组中的一个数,从i = 0开始到i = arr.length - 1结束,每次遍历将它插入到它前面的序列的对应位置上。实现import java.util.Arrays;import jav原创 2022-01-04 14:27:04 · 557 阅读 · 0 评论