算法
文章平均质量分 59
惊鸿只为卿
惊鸿一面,只待卿来。分享互联网技术,算法、面试相关,以及一些有趣的事。
展开
-
从一道概率问题说起
从一道概率问题说起本文选取面试过程中有意思的概率问题来进行讨论和分享,具体如下: 给定一个函数rand7(),每次调用都能够等概率的生成1-7这7个数字,利用这个函数如何等概率地生成1~9呢,即实现函数rand9()。分析我们能够利用的有限条件是rand7()这个函数,它能够等概率地生成1-7,而我们需要等概率地生成1~9,这中间必然是有联系,且能够进行转换的。换一个角度,如果我们有rand9(),那么如何实现rand7()呢?实际上,如果我们有rand9()这个函数的话,每次生成的数据原创 2021-09-07 16:38:30 · 416 阅读 · 0 评论 -
LeetCode 表达式求值/基本计算器 通用解法
LeetCode刷题最好按照标签归类来刷,本文主要对leetcode上的表达式求值(基本计算器)问题做一个梳理。这个问题实际上是一个很基础也很常见的问题,在《算法4》中也有提及使用双栈来解决,本文基于双栈求解该问题做了一个详解。实际在上一篇LeetCode 括号问题专栏中也提及了栈结构可用于处理表达式求值问题,在LeetCode中该类问题也有很多,理解本文后,可以使用该解法解决LC上所有该类问题。LC224. 基本计算器LC227. 基本计算器 IILC772. 基本计算器 III基本计算器原创 2021-07-11 18:04:53 · 758 阅读 · 0 评论 -
LeetCode 括号问题专栏
LeetCode刷题最好按照标签归类来刷,本文主要对leetcode上的主要括号问题做一个梳理。括号问题实际上在字符串中常出现,还有一些表达式求值的问题上也有应用,因此本次做一个总结。LC20 有效括号LC22 括号生成LC23 最长有效括号LC678. 有效的括号字符串LC1190. 反转每对括号间的子串LC1249 移除无效的括号括号问题的核心括号都是左右括号成对出现的,因此有效的括号必须满足一下条件:在整个字符串中 左右括号的数目必须相同在遍历字符串的过程中,左括号的数目总原创 2021-07-10 00:05:53 · 609 阅读 · 5 评论 -
动态规划 背包
目标和LeetCode 494对每一个数字都可以进行 + 操作 或者 - 操作,实际上最后就是一个树的搜索问题。使用深度优先进行遍历,需要记录当前访问的是第几个元素,当前的结果。递归结束的条件:1)当前位置超过数组的边界2)当前和等于目标和,记录结果 class Solution { List<String> res = new ArrayList<>(); public int findTargetSumWays(int[] n原创 2021-07-07 00:00:45 · 102 阅读 · 3 评论 -
树的非递归遍历(统一形式)
树的遍历本文针对树的前中后序的非递归遍历,统一模板。前序遍历public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); if(root == null){ return res; } Stack<TreeNode> stack = new原创 2021-05-26 00:03:24 · 193 阅读 · 0 评论 -
递归构造数组
构造数组题目:给定一个整数N,构造一个长度为N的数组a,对于任意的i<k<j,满足a[i]+a[j]!=2*a[k]分析可以类比数学归纳法,假定一组数据成立,判断另外一组是否也成立。1、当只有一个数字时,肯定满足题意,比如 a={1}2、当数组中存在a[i]+a[j]!=2a[k]那么存在一种变换:如对每个数都进行+1操作,使得操作后的数,也满足式子成立:(a[i]+1)+(a[j]+1) !=2(a[k]+1),这样就根据原有的数据扩充了一组数据。同样的我们是否可以做一个原创 2021-04-24 11:38:34 · 446 阅读 · 0 评论 -
算法目录
算法分类总结算法常刷常新,不刷就忘,这个专栏目录记录日常学习的算法,包括Leetcode,还有工作中遇到的算法问题,对问题进行归类病做一些总结,记录下一些通用的规律和自己的心得。这里先建一个目录,做一个备忘链表树数组动态规划回溯问题系统设计概率类...原创 2021-03-24 23:09:10 · 120 阅读 · 0 评论 -
动态规划 回文篇
回文字符串指的是字符串从左到右 和从右到左是一样的。对于从i到j的子串,判断其回文s[i]==s[j] &amp;&amp;(flag[i+1][j-1] || j-i&lt;=1)1、最小回文分割次数求最小的切分,使得分割后每个子串都是回文的。状态 dp[i] 表示从i到n-1的最小回文分割数目,那么对于任意的一个j,j属于[i,n-1],如果[i,j]是回文的话,则dp[i]=m...原创 2018-12-28 20:43:05 · 1606 阅读 · 0 评论 -
堆排序及其应用
介绍堆排序及其应用,topk问题,优先级队列等。原创 2018-12-20 23:14:45 · 839 阅读 · 0 评论 -
快速排序及其应用
快速排序被称为是20世纪10大算法之一,可见其重要性,不明觉厉。学习快速排序不单单只是一种排序算法,更重要的是其中包含的思想,分治思想。下面进入正题,本文将给出多种快速排序的方法,并给予评价。快速排序的思想是分治,分而治之,和归并排序一样,我们将大问题分解同小规模的具有相同解法的小问题。快速排序的重点在分,归并侧重“并”,所谓分,指的是找到一个位置,这个位置的数将序列划分成两部分,左边比它...原创 2018-12-20 23:03:11 · 1964 阅读 · 0 评论 -
归并排序及其应用
归并排序及其应用归并排序采用分治和递归的思想完成排序,简单来说就是,将一个规模较大的排序问题转换成两个较小规模的问题,最终形成两个已经排好的序的子数组,进而进行归并即可。左路归并右路归并合并左右两路已排好序的数组具体代码如下:public class MergeSort { /** * 归并排序 分治,整体排序=左右两边有序+合并后再排序 * @para...原创 2018-10-14 16:01:02 · 942 阅读 · 0 评论 -
子数组累加和问题
给定一个整数数组(无序且有正有负)和一个目标值,求这个数组中子数组的和为目标值的子数组的最大长度。 求解思路:子数组是连续的,s[i]表示从0~i位置的累加和,s[j]表示0~j位置的累加和,那么从j+1~i位置的累加和为s[j]-s[i],他可以表示任意子数组的累加和,如果这个累加和就是目标值aim,那么找出长度最长的即可。 遍历一遍数组,并求出各个位置的累加和,如在i位置时求得为s[i]原创 2018-01-06 22:28:01 · 980 阅读 · 0 评论 -
DFS求解迷宫问题
DFS求解迷宫问题给定一个迷宫地图,实际就是一个二维的数组,其中0代表可通过,1代表有障碍不能通过,求出所有路径。这种搜索问题一般使用深度搜索DFS,从出口处开始,根据选择的不同方向(上下左右)来到达另一个位置,这时可以把新到达的位置看做是新的起点,这样就可以递归的求解同样的子问题,递归结束的条件是最后到达了终点。在搜索的过程中,我们可以进行剪枝操作,我们先沿着某个方向走,并沿途把走过的节点进行标记原创 2017-09-25 21:41:17 · 4322 阅读 · 0 评论