Algorithm
小毅哥哥1996
天赋,是持续不断的忍耐!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
常见算法整理_1
字符串 字符串流中第一个只出现一次的字符 判断字符串是否表示为数值 字符串左旋K位操作 正则表达式匹配问题 字符串转整数 扑克牌顺子 翻转一句话中的单词 旋转字符串问题(难) 数组问题 构建乘积数组 数组中重复的数字 和为sum的两个数字 数组中只有唯一一个元素重复 数组中只出现一次的两个数字 有序数组统计个数 使奇数处于偶数的前面 顺时针打印矩阵 数组中出现超过一半的元素 top K 问题 连续子数组最大和 把数组中的数字组合成最小的数 数组中逆序对问题 和为Sum的连续正整数序列 数学相关.原创 2020-09-29 08:30:21 · 416 阅读 · 0 评论 -
手撕代码之“字符串”
文章目录字符串流中第一个只出现一次的字符判断字符串是否表示为数值字符串左旋K位操作正则表达式匹配问题字符串转整数扑克牌顺子翻转一句话中的单词 字符串流中第一个只出现一次的字符 题目描述: 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 解题思路1: (1)使用一个HashMap< Character,Integer>来存放字符:个数原创 2020-07-27 09:45:10 · 280 阅读 · 0 评论 -
手撕代码之“数学问题”
文章目录不用加法做加法快速幂整数二进制中的1的个数丑数的个数 不用加法做加法 题目描述: 不使用+ - * /运算符求解两个整数的加法 解题思路: 将两个整数转化位二进制num1和num2; (1)不考虑进位情况,求两个二进制位相加结果,即int sum=num1^num2; (2)求解两数相加的进位,两数相与在左移一位,即int carry=(num1&num2)<<1; (2)上述两个步骤的结果再次循环计算,直到carry进位为0为止。 public class Solution {原创 2020-07-27 09:44:31 · 246 阅读 · 0 评论 -
手撕代码之“数组”
文章目录构建乘积数组数组中重复的数字和为sum的两个数字数组中只有唯一一个元素重复数组中只出现一次的两个数字有序数组统计个数使奇数处于偶数的前面顺时针打印矩阵数组中出现超过一半的元素top K 问题连续子数组最大和把数组中的数字组合成最小的数数组中逆序对问题和为Sum的连续正整数序列 构建乘积数组 题目描述: 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0]原创 2020-07-27 09:43:49 · 514 阅读 · 0 评论 -
手撕代码之“二分查找”
文章目录旋转数组找最小[1,n]整数数组中找1出现的总个数在二维数组中查找值 旋转数组找最小 题目描述: 输入一个旋转数组,找出这个数组中的最小值,要求时间复杂度为(logn) 题目分析: 旋转数组:指的是将一个有序的数组的前一部分移动到后一部分,如[1,2,3,4,5]的一个旋转数组为:[2,4,5,1,2] 时间复杂度为logn:立刻想到二分法(折半查找) 二分查找一般需要个固定的比较值,然而这道题却没有,怎么办?根据题意具体分析有以下几种情况: (1)[4,5,6,1,2,3],arr[mid]&原创 2020-07-27 09:41:00 · 216 阅读 · 0 评论 -
手撕代码之“栈”
文章目录数据流中的中位数问题判断栈的入栈顺序和出栈顺序是否一致包含Min函数的栈结构 数据流中的中位数问题 题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 题目的分析: 这道题目要使用到PriorityQueue优先级队列,我们先来介绍优先级队列,它是一种特殊的队原创 2020-07-27 09:39:56 · 230 阅读 · 0 评论 -
手撕代码之“动态规划”
文章目录动态规划问题套路剪绳子问题 动态规划问题套路 (1)确定状态(问题描述中的自变量)和选择(可能改变状态的操作) (2)定义dp表 (3)根据选择,思考状态转移的逻辑关系 剪绳子问题 问题描述 有根长度为m的绳子,把绳子剪成整数长的n段,n<=m,求出每段长度的最大乘积。 解题思路 使用动态规划的方法求解,按照动态规划的套路开始: 状态: 绳子的长度; 定义dp: dp[i]表示长度为i的绳子的分段后的最大乘积; 选择: 剪和不剪; 不剪切的则为dp[i],自底而上推导:j*dp[i-j]表示剪原创 2020-07-27 09:37:39 · 227 阅读 · 0 评论 -
手撕代码之“递归问题”
文章目录机器人运动范围从矩阵种匹配字符串矩形覆盖问题跳阶梯问题I跳阶梯问题II跳台接问题III跳台阶问题IIII 机器人运动范围 题目描述: 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子? 解题分析: (1)利用递原创 2020-07-27 09:36:25 · 331 阅读 · 0 评论 -
手撕代码之“链表”
文章目录删除重复链表链表中找环的入口约瑟夫环问题两条链表中的公共节点复制复杂的链表问题合并两条链表链表的反转输出链表倒数第K个节点从尾到头打印链表 删除重复链表 题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路: (1)新建一个指向头节点pHead的新节点Head (2)tmp指向链表的实际头节点pHead (3)同原创 2020-07-17 19:53:58 · 411 阅读 · 0 评论 -
手撕代码之查找问题
文章目录旋转数组找最小[1,n]整数数组中找1出现的总个数在二维数组中查找值 旋转数组找最小 题目描述: 输入一个旋转数组,找出这个数组中的最小值,要求时间复杂度为(logn) 题目分析: 旋转数组:指的是将一个有序的数组的前一部分移动到后一部分,如[1,2,3,4,5]的一个旋转数组为:[2,4,5,1,2] 时间复杂度为logn:立刻想到二分法(折半查找) 二分查找一般需要个固定的比较值,然而这道题却没有,怎么办?根据题意具体分析有以下几种情况: (1)[4,5,6,1,2,3],arr[mid]&原创 2020-09-29 08:29:17 · 185 阅读 · 0 评论 -
手撕代码之“二叉树”
文章目录重构二叉树(中等难度)树的镜像(简单)求树的深度(简单)树的平衡性检测(简单)树的层序遍历(中等)二叉树的下一个节点(中等)二叉排序树转换成双端链表(中等)子树问题(简单)二叉搜素树的第k个节点二叉树的序列化与反序列化Z字形打印树对称二叉树根节点到叶子节点和为sum的问题总结是否存在路径找到所有的路径计算路径的总条数BST后序遍历序列总结 重构二叉树(中等难度) 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍原创 2020-07-07 09:29:05 · 987 阅读 · 2 评论 -
哈希表及其应用分析
文章目录哈希表什么是哈希表哈希表的经典案例分析 哈希表 什么是哈希表 首先,哈希表是一种数据结构,它通过某种映射函数index=f(keyValue)index=f(keyValue)index=f(keyValue)将keyValue映射为某个可以直接访问的位置(索引),从而能加快在该数据结构中查询keyValue的速度。因此一个哈希表通常由数组+链表的结构组合而成,通过数组的索引能快速访问到keyValue存储在哪条链表中,然后再去遍历链表,便可以迅速找到这个keyValue,这样充分利用了数组能快速访原创 2020-06-04 20:58:40 · 417 阅读 · 0 评论 -
程序员常用查询算法
文章目录查找算法线性查找二分查找插值查找斐波那契查找 查找算法 要求: 从数组中找出指定的关键值(key),常用的查找算法有4种: (1)线性查找,也称为顺序查找 (2)二分查找 (3)插值查找 (4)斐波那契查找 说明: (2)、(3)、(4)本质上都是通过数组的中间值,将关键字(key)逐渐缩小查找范围,二分查找以数组中间值将查找范围缩小一半;插值查找也是通过某个中间值来缩小查找范围,但是中间值是动态变化的,根据插值公式计算;同理斐波那契查找算法是通过斐波那契数列关系推导出中间值,从而缩小关键值的查找范原创 2020-06-04 17:40:57 · 489 阅读 · 0 评论 -
程序员必备排序算法及相关时间复杂度分析
文章目录常用的时间复杂度常数阶O(1)O(1)O(1)对数阶 O(log2n)O(log_2n)O(log2n)线性阶O(n)O(n)O(n)线性对数阶O(nlog2n)O(nlog_2n)O(nlog2n)平方阶O(n2)O(n^2)O(n2)立方阶O(n^3)程序员必备排序算法冒泡排序(Bubble Sort)快速排序(QuickSort)选择排序(Selection Sort)插入排序希尔排序归并排序桶排序 常用的时间复杂度 常数阶O(1)O(1)O(1) 说明: 只要代码中没有复杂的循环条件,无原创 2020-06-04 11:36:35 · 689 阅读 · 0 评论 -
递归和回溯求解8皇后问题
文章目录递归和回溯递归原理回溯原理递归和回溯算法的经典应用场景8皇后问题的Java代码实现 递归和回溯 递归原理 (1)什么是递归? 答:递归就是自己调用自己,每次调用都传入不同的变量 (2)递归调用的机制 答:栈。当程序执行到一个方法的时候,为该方法开辟一个独立的栈空间用于存放该方法所用到的全部变量,如果这些变量是引用变量,那么他们则是共享一个变量空间,其他的变量有独立的空间。 (3)使用递归的重要规则 终止条件 递归调用过程中逐渐先终止条件趋近,否者是死递归 回溯原理 (1)什么是回溯? 答:简单来原创 2020-06-02 11:46:35 · 185 阅读 · 0 评论 -
常用链表及其必备操作
文章目录单链表的反转算法获取链表中有效节点的个数(不包含头节点)获取倒数第K个结点合并两条有序的单链表,合并之后仍然是有序的双向链表单向环形链表josehu环问题 #常用链表链及其必备操作 单链表的反转算法 思路分析 (1)遍历单链表,获取当前链表的当前结点curNode,并记录当前结点的下一个结点nextNode; (2) 新建一个反转链表reverseHead,将当前结点curNode插入到reverseHead的最前面的结点(curNode.next=reverseHead.next;reverseH原创 2020-06-01 20:23:48 · 308 阅读 · 0 评论 -
您凭什么使用“稀疏矩阵”
文章目录为什么要使用稀疏矩阵稀疏矩阵的存储结构矩阵转化为稀疏矩阵的常规步骤Java代码实现 为什么要使用稀疏矩阵 (1)稀疏矩阵描述了矩阵的存储结构,能用较少的内存描述矩阵的本质 (2)当矩阵中含0的元素非常多的情况下,才适合用稀疏矩阵 稀疏矩阵的存储结构 1 2 3 0 rowCount colCount valueCount(!=0) 1 rowIndex colIndex value 2 rowIndex colIndex value 矩阵转化为稀疏矩阵的常规步骤 Ste原创 2020-05-30 15:25:47 · 324 阅读 · 0 评论
分享