随笔分类 -  算法思维系列

摘要:我知道大家会各种花式排序算法,但是如果叫你打乱一个数组,你是否能做到胸有成竹?即便你拍脑袋想出一个算法,怎么证明你的算法就是正确的呢?乱序算法不像排序算法,结果唯一可以很容易检验,因为「乱」可以有很多种,你怎么能证明你的算法是「真的乱」呢? 所以我们面临两个问题: 1. 什么叫做「真的乱」? 2. 阅读全文
posted @ 2020-02-17 12:01 labuladong 阅读(3554) 评论(0) 推荐(0) 编辑
摘要:本文分两部分,第一部分列举几个有趣的位操作,第二部分讲解算法中常用的 n & (n 1) 操作,顺便把用到这个技巧的算法题列出来讲解一下。因为位操作很简单,所以假设读者已经了解与、或、异或这三种基本操作。 位操作(Bit Manipulation)可以玩出很多奇技淫巧,但是这些技巧大部分都过于晦涩, 阅读全文
posted @ 2020-02-17 11:58 labuladong 阅读(353) 评论(0) 推荐(0) 编辑
摘要:对于比较小的数字,做运算可以直接使用编程语言提供的运算符,但是如果相乘的两个因数非常大,语言提供的数据类型可能就会溢出。一种替代方案就是,运算数以字符串的形式输入,然后模仿我们小学学习的乘法算术过程计算出结果,并且也用字符串表示。 需要注意的是, 和 可以非常长,所以不可以把他们直接转成整型然后运算 阅读全文
posted @ 2020-02-17 11:57 labuladong 阅读(1166) 评论(0) 推荐(0) 编辑
摘要:二分查找到底有能运用在哪里? 最常见的就是教科书上的例子,在 有序数组 中搜索给定的某个目标值的索引。再推广一点,如果目标值存在重复,修改版的二分查找可以返回目标值的左侧边界索引或者右侧边界索引。 PS:以上提到的三种二分查找算法形式在前文「二分查找详解」有代码详解,如果没看过强烈建议看看。 抛开有 阅读全文
posted @ 2020-02-17 11:55 labuladong 阅读(696) 评论(0) 推荐(0) 编辑
摘要:首先说明一个问题,简单阐述一下递归,分治算法,动态规划,贪心算法这几个东西的区别和联系,心里有个印象就好。 递归是一种编程技巧,一种解决问题的思维方式;分治算法和动态规划很大程度上是递归思想基础上的(虽然动态规划的最终版本大都不是递归了,但解题思想还是离不开递归),解决更具体问题的两类算法思想;贪心 阅读全文
posted @ 2020-02-17 11:54 labuladong 阅读(387) 评论(0) 推荐(0) 编辑
摘要:下文是我在 LeetCode 刷题过程中总结的三道有趣的「脑筋急转弯」题目,可以使用算法编程解决,但只要稍加思考,就能找到规律,直接想出答案。 一、Nim 游戏 游戏规则是这样的:你和你的朋友面前有一堆石子,你们轮流拿,一次至少拿一颗,最多拿三颗,谁拿走最后一颗石子谁获胜。 假设你们都很聪明,由你第 阅读全文
posted @ 2020-02-17 11:15 labuladong 阅读(171) 评论(0) 推荐(0) 编辑
摘要:烧饼排序是个很有意思的实际问题:假设盘子上有 块 面积大小不一 的烧饼,你如何用一把锅铲进行若干次翻转,让这些烧饼的大小有序(小的在上,大的在下)? 设想一下用锅铲翻转一堆烧饼的情景,其实是有一点限制的,我们每次只能将最上面的若干块饼子翻转: 我们的问题是, 如何使用算法得到一个翻转序列,使得烧饼堆 阅读全文
posted @ 2020-02-17 11:14 labuladong 阅读(616) 评论(0) 推荐(0) 编辑
摘要:我把双指针技巧再分为两类,一类是「快慢指针」,一类是「左右指针」。前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环;后者主要解决数组(或者字符串)中的问题,比如二分查找。 一、快慢指针的常见算法 快慢指针一般都初始化指向链表的头结点 head,前进时快指针 fast 在前,慢指针 slo 阅读全文
posted @ 2020-02-17 10:10 labuladong 阅读(840) 评论(0) 推荐(0) 编辑
摘要:这是好久之前的一篇文章「学习数据结构和算法的框架思维」的修订版。之前那篇文章收到广泛好评,没看过也没关系,这篇文章会涵盖之前的所有内容,并且会举很多代码的实例,教你如何使用框架思维。 首先,这里讲的都是普通的数据结构,咱不是搞算法竞赛的,野路子出生,我只会解决常规的问题。另外,以下是我个人的经验的总 阅读全文
posted @ 2020-02-17 10:08 labuladong 阅读(1936) 评论(0) 推荐(1) 编辑
摘要:素数的定义看起来很简单,如果一个数如果只能被 1 和它本身整除,那么这个数就是素数。 不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。比如让你写这样一个函数: 你会如何写这个函数?我想大家应该会这样写: java int countPrimes(int n) { boolean[ 阅读全文
posted @ 2020-02-17 10:04 labuladong 阅读(1450) 评论(0) 推荐(0) 编辑
摘要:我最近在 LeetCode 上做到两道非常有意思的题目,382 和 398 题,关于水塘抽样算法(Reservoir Sampling),本质上是一种随机概率算法,解法应该说会者不难,难者不会。 我第一次见到这个算法问题是谷歌的一道算法题:给你一个 未知长度 的链表,请你设计一个算法, 只能遍历一次 阅读全文
posted @ 2020-02-17 10:00 labuladong 阅读(411) 评论(0) 推荐(0) 编辑
摘要:之前发的那篇关于框架性思维的文章,我也发到了不少其他圈子,受到了大家的普遍好评,这一点我真的没想到,首先感谢大家的认可,我会更加努力,写出通俗易懂的算法文章。 有很多朋友问我数据结构和算法到底该怎么学,尤其是很多朋友说自己是「小白」,感觉这些东西好难啊,就算看了之前的「框架思维」,也感觉自己刷题乏力 阅读全文
posted @ 2020-02-17 09:55 labuladong 阅读(772) 评论(0) 推荐(1) 编辑
摘要:本文详解「滑动窗口」这种高级双指针技巧的算法框架,带你秒杀几道高难度的子字符串匹配问题。 LeetCode 上至少有 9 道题目可以用此方法高效解决。但是有几道是 VIP 题目,有几道题目虽不难但太复杂,所以本文只选择点赞最高,较为经典的,最能够讲明白的三道题来讲解。第一题为了让读者掌握算法模板,篇 阅读全文
posted @ 2020-02-17 09:54 labuladong 阅读(14662) 评论(0) 推荐(5) 编辑
摘要:这篇文章是很久之前的一篇《回溯算法详解》的进阶版,之前那篇不够清楚,就不必看了,看这篇就行。把框架给你讲清楚,你会发现回溯算法问题都是一个套路。 废话不多说,直接上回溯算法框架。 解决一个回溯问题,实际上就是一个决策树的遍历过程 。你只需要思考 3 个问题: 1、路径:也就是已经做出的选择。 2、选 阅读全文
posted @ 2020-02-17 09:53 labuladong 阅读(11270) 评论(0) 推荐(1) 编辑
摘要:本文是区间系列问题的第三篇,前两篇分别讲了区间的最大不相交子集和重叠区间的合并,今天再写一个算法,可以快速找出两组区间的交集。 先看下题目,LeetCode 第 986 题就是这个问题: 题目很好理解,就是让你找交集,注意区间都是闭区间。 思路 解决区间问题的思路一般是先排序,以便操作,不过题目说已 阅读全文
posted @ 2020-02-17 09:51 labuladong 阅读(2144) 评论(0) 推荐(0) 编辑
摘要:很多算法问题都需要排序技巧,其难点不在于排序本身,而是需要巧妙地排序进行预处理,将算法问题进行转换,为之后的操作打下基础。 信封嵌套问题就需要先按特定的规则排序,之后就转换为一个 "最长递增子序列问题" ,可以用前文 "二分查找详解" 的技巧来解决了。 一、题目概述 信封嵌套问题是个很有意思且经常出 阅读全文
posted @ 2020-02-17 09:50 labuladong 阅读(767) 评论(0) 推荐(0) 编辑
摘要:Two Sum 系列问题在 LeetCode 上有好几道,这篇文章就挑出有代表性的几道,介绍一下这种问题怎么解决。 TwoSum I 这个问题的 最基本形式 是这样:给你一个数组和一个整数 ,可以保证数组中 存在 两个数的和为 ,请你返回这两个数的索引。 比如输入 ,算法应该返回数组 ,因为 3 + 阅读全文
posted @ 2020-02-17 09:48 labuladong 阅读(311) 评论(0) 推荐(0) 编辑

我的公众号 labuladong,专注于 LeetCode 刷题,欢迎关注。