
算法
算法
明德路上的小钟
这个作者很懒,什么都没留下…
展开
-
删除链表中的节点和删除链表中的重复元素
1. 删除链表的节点思路:当我们要删除节点i,先把i的下一个结点j的内容复制到i,然后把i的指针指向节点j的下一个节点。此时再删除节点j,其效果刚好把节点i删除了;当删除的节点位于链表的尾部,从投头顺序遍历得到该节点的前序节点,并完成删除;当链表只有一个节点的时候,把链表的头结点设置null。//代码来自 https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/solution/cong-on-dao-o1-by-ml-z原创 2020-10-11 12:18:33 · 212 阅读 · 0 评论 -
打印1到最大的n位数
1. 字符串模拟数字加法第一步:字符串表达的数字上模拟加法第二步:字符串表达的数字打印出来public static void printToMaxOfDigits(int n) { if (n <= 0) return; char number[] = new char[n]; //使用数组来存储大数 for (int i = 0; i < number.length; i++) { number[i] = 0;原创 2020-10-08 19:55:50 · 130 阅读 · 0 评论 -
位运算、二进制中的1的个数和位运算的相关题目
1. 与、或、异或的运算规律与(&)或(丨)异或(^)0 & 0 = 00 丨 0 = 00 ^ 0 = 01 & 0 = 01 丨 0 = 11 ^ 0 = 10 & 1 = 00 丨1 = 10 ^ 1 = 11 & 1 = 11 丨 1 = 11 ^ 1 = 02. 二进制中的1的个数2.1 可能引起死循环的解法思路:先判断整数二进制表示中最右边一位是不是1;接着把输入的整数右移一位,此时原来处原创 2020-10-06 20:13:50 · 380 阅读 · 0 评论 -
动态规划、贪婪算法、剪绳子
1.动态规划使用条件:问题能够分解成若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑使用动态规划来解决这个问题。特点:求一个问题的最优解;整体问题的最优解是依赖各个子问题的最优解;大问题分解成若干个小问题,这些小问题之间还有相互重叠的更小的子问题;从上往下分析问题,从下往上求解问题。1.1 剪绳子需要O(n2)的时间复杂度和O(n)空间复杂度public class CuttingSolution { public static int maxProductCut原创 2020-10-05 19:26:46 · 262 阅读 · 1 评论 -
回溯法之矩阵中的路径和机器人的运动范围
1. 回溯法回溯法解决非常适合有多个步骤组成的问题,并且每个步骤都有多个选项。用回溯法解决的问题的所有选项可以形象地用树状结构表示。如果再叶节点的状态不满足约束条件。那么只好回溯它的上一个节点再尝试其他的选项。1.1 矩阵中的路径public class Solution1 { public boolean hasPath(char[] matrix, int rows, int cols, char[] str) { //标志位,初始化为false boole原创 2020-10-05 18:04:20 · 213 阅读 · 1 评论 -
插入、冒泡、归并、快排时间复杂度和空间复杂度
排序方法时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性复杂性插入排序O(n2)O(n2)O(n)O(1)稳定简单冒泡排序O(n2)O(n2)O(n)O(1)不稳定较复杂归并排序O(nlog2n)O(nlog2n)O(nlog2n)O(n)稳定较复杂快速排序O(nlog2n)O(n2)O(nlog2n)O(nlog2n)不稳定较复杂1. 插入排序/** * 插入排序的 ...原创 2020-09-25 10:51:49 · 5506 阅读 · 0 评论 -
斐波那契数列数列的三种实现方法
1. 效率很低的解法:public static long fibonacci1(int n) { if (n <= 0) return 0; if (n == 1) return 1; return fibonacci1(n-1) + fibonacci1(n-2); }缺点:递归求解的过程中,有很多的节点是重复的,而且重复的节点数会随着n的增大而急剧增加,这就意味着计算量会随着n的增大而急剧增大。2. 避免重复节点的方法从下往上计算原创 2020-09-22 21:36:35 · 703 阅读 · 1 评论 -
二分查找、归并排序和快速排序
package com.mingde.offer;/** * @author bro * @date 2020/9/22 9:23 * @desc */public class Sort { /** * 二分查找 * * @param array * @param a * @return */ public static int biSearch(int[] array, int a) { int lo原创 2020-09-22 20:43:41 · 427 阅读 · 0 评论 -
重建二叉树和二叉树的下一个节点
1. 重建二叉树1.1 知道前序和中序的情况下/** * @author bro * @date 2020/9/21 19:30 * @desc */public class Rebuild { public static TreeNode rebuildBinaryTree(int[] preOrder, int[] inOrder) { if (preOrder == null || inOrder == null) return null; Tr原创 2020-09-22 20:40:28 · 150 阅读 · 0 评论 -
链表中找到第一个含有某值的节点并删除该节点、从头到尾打印链表
1. 链表中找到第一个含有某值的节点并删除该节点方法一:分析:这道题有普通的做法,就是依次遍历节点,发现了节点的值等于给定的值,就将节点删除。但是删除节点,对于普通的链表来说,如果是头节点,还好,直接head=head.next,再依次往后遍历。这里有个极端的情况,如果头节点一直就是需要删除的节点,那么这个删除还需要做一个while循环。另外,对于普通节点的删除,我们通常只需要将当前节点的上一个节点的next指向当前节点的next即可,所以,我们在遍历的过程中,需要两个指针,一个指向当前节点,一个原创 2020-09-21 20:43:18 · 570 阅读 · 0 评论 -
二叉树三种遍历的6中实现方式
import java.util.LinkedList;import java.util.Stack;/** * @author bro * @date 2020/9/21 9:59 * @desc */public class Construct { /** * 先序递归 * * @param biTree */ public static void preOrderRe(TreeNode biTree) { Syst原创 2020-09-21 20:40:53 · 176 阅读 · 0 评论 -
数组中重复的数字、二维数组中的查找和替换空格以及两个有序数组A1A2的合并
1. 数组中的重复数字解法一:将数组排序,快排,排序一个长度为n的数组需要O(nlogn)的时间。解法二:利用HashMap,记录每个数字出现次数,第一个大于2的即可返回。时间复制度为O(n),需要大小为O(n)的哈希表为代价。其实也是一种通用思想,题目条件中有“一个长度为n的数组里,所有数字都在[0,n-1]”。那么我们可以不开辟新的存储空间,就可以在O(n)时间复杂度里完成本题。即从头遍历,目的是让每个位置都存其对应的数值,比如a[0]存0,a[3]存3。/** * @author br原创 2020-09-20 19:56:31 · 378 阅读 · 1 评论