算法
MoeYang
擅长各种leetcode暴力解法
展开
-
Leetcode.315 计算右侧小于当前元素的个数【线段树】
给定一个整数数组 nums,按要求返回一个新数组counts。数组 counts 有该性质: counts[i] 的值是nums[i] 右侧小于nums[i] 的元素的数量。示例:输入:nums = [5,2,6,1]输出:[2,1,1,0]解释:5 的右侧有 2 个更小的元素 (2 和 1)2 的右侧仅有 1 个更小的元素 (1)6 的右侧有 1 个更小的元素 (1)1 的右侧有 0 个更小的元素提示:0 <= nums.length <= ...原创 2021-02-26 20:28:45 · 240 阅读 · 0 评论 -
Leetcode218.天际线问题【扫描线】
解法如图,假设有一条线从左往右扫描数组:1、遇到左端点,则记录当前x坐标下的最大高度2、遇到右端点,则记录当前x坐标下的最大高度很明显,我们可以采用大顶堆来存储坐标为x时,当前建筑的高度h[x].遇到左端点则把高度入堆,当前堆顶元素即为x处最大高度遇到右端点,则把对应建筑的左端点出堆,此时堆顶同样是x处最大高度代码func getSkyline(buildings [][]int) [][]int { heights := make([][]int, 0, ...原创 2021-02-24 17:25:58 · 296 阅读 · 0 评论 -
Leetcode.204 求质数【埃氏筛】
统计所有小于非负整数n的质数的数量。示例 1:输入:n = 10输出:4解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2:输入:n = 0输出:0示例 3:输入:n = 1输出:0提示:0 <= n <= 5 *解法质数相关问题有个套路方法叫埃氏筛:如果x是质数,那么大于x的倍数2x,3x...一定不是质数。所以我们可以根据这个思路,搞一个数组,记录每个...原创 2021-02-22 17:02:11 · 180 阅读 · 0 评论 -
Leetcode.152 乘积最大子数组 【动态规划】
给你一个整数数组 nums,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释:子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释:结果不能为 2, 因为 [-2,-1] 不是子数组。解法1、暴力法:直接二重循环取最大,时间复杂度O(), 空间复杂度O(1)2、动态规划:我们假设dp[i]是以i为结尾的连续子数组的最大乘积,...原创 2021-02-12 21:37:11 · 160 阅读 · 0 评论 -
Leetcode 91.解码方法【动态规划】
一条包含字母A-Z 的消息通过以下映射进行了 编码 :'A' -> 1'B' -> 2...'Z' -> 26要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"111" 可以将 "1" 中的每个 "1" 映射为 "A" ,从而得到 "AAA" ,或者可以将 "11" 和 "1"(分别为 "K" 和 "A" )映射为 "KA" 。注意,"06" 不能映射为 "F" ,因为 "6" 和 "06" 不同。给你一个只含数字的 .原创 2021-02-06 18:01:37 · 198 阅读 · 0 评论 -
LeetCode 1631. 最小体力消耗路径【并查集】
1631. 最小体力消耗路径你准备参加一场远足活动。给你一个二维rows x columns的地图heights,其中heights[row][col]表示格子(row, col)的高度。一开始你在最左上角的格子(0, 0),且你希望去最右下角的格子(rows-1, columns-1)(注意下标从 0 开始编号)。你每次可以往 上,下,左,右四个方向之一移动,你想要找到耗费 体力 最小的一条路径。一条路径耗费的 体力值是路径上相邻格子之间 高度差绝对值的 最大值决定...原创 2021-01-29 20:49:17 · 330 阅读 · 0 评论 -
LeetCode 25. K 个一组翻转链表
这题难度是hard,但解法并没什么复杂度,主要是边界判定,所以直接上代码了func reverseKGroup(head *ListNode, k int) *ListNode { if k == 1 || head == nil { return head } var n int head = &ListNode{Next: head} pre := head for node := head.Next; node != nil; { n++ // 每次需要翻转..原创 2021-01-27 20:00:07 · 127 阅读 · 0 评论 -
最小生成树:Leetcode1135.最低成本联通所有城市
题目:如题,经典的最小生成树解法:1、什么是最小生成树现在假设有一个很实际的问题:我们要在n个城市中建立一个通信网络,则连通这n个城市需要布置n-1一条通信线路,这个时候我们需要考虑如何在成本最低的情况下建立这个通信网?于是我们就可以引入连通图来解决我们遇到的问题,n个城市就是图上的n个顶点,然后,边表示两个城市的通信线路,每条边上的权重就是我们搭建这条线路所需要的成本,所以现在我们有n个顶点的连通网可以建立不同的生成树,每一颗生成树都可以作为一个通信网,当我们构造这个连通网所花的成本最小原创 2021-01-15 17:41:40 · 1341 阅读 · 0 评论 -
Leetcode面试题 17.24. 最大子矩阵: 套用最大子序列和解法ac二维数组最大子矩阵和
53. 最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。这一题大家应该都做过,基本思路是从左到右求数组和tmpSum += arr[i],一旦和tmpSum<0, 就重置tmpSum=0. 遍历一遍就能求最大和,具体证明略。那么进入正题,最大子矩阵是求一个矩阵中的和最大的子矩阵原题如下:给定一个正整数、负整数和 0 组成的 N × M矩阵,编写代码找出元素总和最大的子矩阵。返回一个数组 [r1, c1, ...原创 2021-01-14 20:38:12 · 294 阅读 · 0 评论 -
Leetcode.735行星撞击或线上跑点追击问题
一条直线上有一些点,每个点有不同方向不同大小的速度,可用[][]int{[1, 3], [3, -1], [10, 2]...} 来表示,其中下标0表示点在直线上的位置,下标1表示点的速度大小(正数向右,负数向左)1、求第一次碰撞发生的时间?2、如果每两个点撞击后都会消失,求稳定后,直线上都剩下哪几个点?3、可能每个点都有自重,自重相同的点撞击后两两消失,自重不同的点撞击后,小的会消失,大的会保留,求稳定状态?最近看到前面这道题,发现leetcode上有个类似的题目,就拿出来做一下。.原创 2021-01-14 18:53:14 · 335 阅读 · 0 评论 -
单调栈:Leetcode面试题17.21直方图的水量
这题单调栈存数组下标遇arr[i] >=栈顶元素 arr[stack[len-1]] 则出栈stack[len-1]并和新栈顶计算存水量.持续循环直到栈为空或栈顶元素>arr[i],则入栈ifunc trap(height []int) int { if len(height) == 0 { return 0 } var res int var stack []int for i, h := range height { l := len(stack) // ..原创 2021-01-13 11:23:59 · 144 阅读 · 0 评论 -
拓扑排序:Leetcode207.课程表
对一个有向无环图进行拓扑排序,就是将这个图的某种依赖关系表现出来(排序结果可能不唯一)规则:图中每个顶点只出现一次。 A在B前面,则不存在B在A前面的路径。(不能成环!!!!) 顶点的顺序是保证所有指向它的下个节点在被指节点前面!(例如A—>B—>C那么A一定在B前面,B一定在C前面)。所以,这个核心规则下只要满足即可,所以拓扑排序序列不一定唯一!来看这道题:Leetcode207.课程表你这个学期必须选修 numCourse 门课程,记为0到numCours...原创 2021-01-12 15:14:32 · 175 阅读 · 0 评论 -
面试题 17.13. 恢复空格: dp+字典树
哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!"已经变成了"iresetthecomputeritstilldidntboot"。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。注意:本题相对原题稍作改动,只需.原创 2021-01-08 22:04:19 · 138 阅读 · 0 评论 -
快速排序的递归及非递归实现
快速排序的递归写法func Quicksort(arr []int, i, j int) { if i >= j { return } m := partion(arr, i, j) Quicksort(arr, i, m-1) Quicksort(arr, m+1, j)}// 把s,e分为两段,并返回分割点idxfunc partion(arr []int, s, e int) int { prefix := arr[s] idx := s + 1 for i .原创 2020-12-23 14:54:56 · 370 阅读 · 0 评论 -
数据挖掘入门——分词
谷歌4亿英镑收购人工智能公司DeepMind,百度目前正推进“百度大脑”项目,腾讯、阿里等各大巨头也在积极布局深度学习。随着社会化数据大量产生,硬件速度上升、成本降低,大数据技术的落地实现,让冷冰冰的数据具有智慧逐渐成为新的热点。要从数据中发现有用的信息就要用到数据挖掘技术,不过买来的数据挖掘书籍一打开全是大量的数学公式,而课本知识早已还给老师了,着实难以下手、非常头大!我们不妨先跳过数学公式转载 2014-09-12 15:26:57 · 866 阅读 · 0 评论 -
如何实现缓存系统的更新机制
问题是这样的:假设要你设计一个缓存系统,你如何实现缓存的更新机制!例如某网站具有高并发访问量,为提高性能,其中的一些网页页面都是存放在缓存中的,当需要更新缓存中的页面时,缓存系统如何完成缓存的更新?在给出解决方案之前,先看看内存数据库Redis中字典的设计。Redis 中的字典结构表示如下:typedef struct dict { // 类型特定函数 dict转载 2014-10-20 09:56:27 · 831 阅读 · 0 评论 -
Trie树应用:统计与匹配
Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。原创 2014-08-09 23:00:29 · 575 阅读 · 0 评论 -
从B树、B+树、B*树谈到R 树
第一节、B树、B+树、B*树1.前言:动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自转载 2014-08-10 20:13:48 · 372 阅读 · 0 评论 -
从头到尾彻底理解KMP
1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱,如此,留言也是“骂声”一片。所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟迟没有修改本文。 然近期因在北京开了个算法班,专门讲解数据结构、面试、算法,才再次仔细回顾了这个KMP,在综合了一些网友的理解、以及跟我一起讲算法的两位讲师朋友曹博、邹转载 2014-08-11 21:13:50 · 576 阅读 · 0 评论 -
算法:找出数组中未出现的那个数字
今天看到一道算法题。将1-100这100个数字原创 2014-09-08 12:36:54 · 1335 阅读 · 0 评论 -
java实现最长公共子序列和最长公共子字符串
动态规划法经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】 求两字符序列的最长公共字转载 2014-08-31 22:20:02 · 3158 阅读 · 0 评论