
算法
算法学习笔记
二进制杯莫停
欲速则不达,慢而有为
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
双指针及滑动窗口类题目总结
双指针及滑动窗口类题目总结双指针情景一Leetcode相关题目情景二Leetcode相关题目双指针情景一我们通过迭代数组来解决一些问题。通常,我们只需要一个指针进行迭代,即从数组中的第一个元素开始,最后一个元素结束。然而,有时我们会使用两个指针进行迭代。经典案例:反转数组中的元素。比如数组为 ['l', 'e', 'e', 't', 'c', 'o', 'd', 'e'],反转之后变为['e', 'd', 'o', 'c', 't', 'e', 'e', 'l']。使用双指针技巧,其思想是分原创 2021-08-22 14:23:49 · 200 阅读 · 0 评论 -
Leetcode算法刷题记录表
题号是否已完成200.岛屿数量141.环形链表144.二叉树前序遍历剑指 Offer 09. 用两个栈实现队列225. 用队列实现栈5. 最长回文子串516. 最长回文子序列剑指 Offer 22. 链表中倒数第k个节点222. 完全二叉树的节点个数.........原创 2021-03-03 22:21:57 · 533 阅读 · 1 评论 -
剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 和 ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素, 操作返回 )示例 1:示例 2:提示:1原创 2022-07-08 11:15:52 · 175 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:提示:各函数的调用总次数不超过 20000 次原创 2022-07-08 11:11:49 · 261 阅读 · 0 评论 -
思维导图-数据结构总览
思维导图-数据结构总览1.线性表1.线性表原创 2022-03-04 15:46:10 · 317 阅读 · 0 评论 -
468. 验证IP地址
468. 验证IP地址示例 1:输入:queryIP = “172.16.254.1”输出:“IPv4”解释:有效的 IPv4 地址,返回 “IPv4”示例 2:输入:queryIP = “2001:0db8:85a3:0:0:8A2E:0370:7334”输出:“IPv6”解释:有效的 IPv6 地址,返回 “IPv6”示例 3:输入:queryIP = “256.256.256.256”输出:“Neither”解释:既不是 IPv4 地址,又不是 IPv6 地址提示原创 2022-03-03 13:38:28 · 394 阅读 · 0 评论 -
118.杨辉三角(简单)
Leetcode链接:118.杨辉三角题目描述给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例 1:输入: numRows = 5输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入: numRows = 1输出: [[1]]提示:1 <= numRows <= 30源码:class Solution { publi原创 2021-08-22 15:53:51 · 214 阅读 · 0 评论 -
Leetcode教你炒股系列
买卖股票的最佳时机买卖股票的最佳时机 II买卖股票的最佳时机 III买卖股票的最佳时机 IV最佳买卖股票时机含冷冻期买卖股票的最佳时机含手续费股票问题系列通解(转载翻译)原创 2021-04-06 11:04:41 · 158 阅读 · 0 评论 -
归并排序
leetcode - 归并排序应用题目:剑指 Offer 51. 数组中的逆序对import java.util.Arrays;public class MergeSort { public static void main(String[] args) { int[] arr = new int[]{3,4,2,5,1,2,6,4}; mergeSort(arr); System.out.println(Arrays.toString(arr原创 2021-03-09 22:26:51 · 98 阅读 · 0 评论 -
最长递增子序列LIS
题目:300. 最长上升子序列题解:https://blog.youkuaiyun.com/qq_41765114/article/details/88415541原创 2020-11-02 16:32:07 · 124 阅读 · 0 评论 -
278. 第一个错误的版本
278. 第一个错误的版本你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version)接口来判断版本号 version是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。示例:给定原创 2020-08-13 00:48:02 · 175 阅读 · 0 评论 -
二叉树广度优先搜索、层次遍历
队列实现广度搜索需要借助队列Java队列的实现类为Queue.方法描述boolean offer(E e)入队,添加一个元素并返回true;如果队列已满,则返回falseE poll()出队,移除并返问队列头部的元素,如果队列为空,则返回nullQueue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就原创 2020-08-11 21:36:26 · 1164 阅读 · 0 评论 -
二叉树的层次遍历
102. 二叉树的层序遍历给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); //队列 Queue<Tre原创 2020-08-11 21:31:50 · 235 阅读 · 0 评论 -
二叉树的前序遍历、中序遍历和后序遍历(迭代解法)
前言二叉树的非递归算法需要借助栈来完成。Java中栈的实现类为Stack.方法有:序号方法描述boolean empty()测试堆栈是否为空。Object pop( )出栈,移除堆栈顶部的对象,并作为此函数的值返回该对象。Object push(Object element)入栈,把项压入堆栈顶部。Object peek( )查看堆栈顶部的对象,但不从堆栈中移除它。int search(Object element)返回对象在堆栈中的位置,以 1原创 2020-08-05 15:40:05 · 1304 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000解题思路:解题思路:本题常见解法如下:(1)哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,最终超过数组长度一半的数字则为众数。此方法时间和空间复杂原创 2020-08-01 17:50:40 · 114 阅读 · 0 评论 -
234. 回文链表
234. 回文链表请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?解题思路方法一:将值复制到数组中后用双指针法class Solution { public boolean isPalindrome(ListNode head) { List<Integer> vals =原创 2020-08-01 17:29:25 · 246 阅读 · 0 评论 -
206. 反转链表
206. 反转链表反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?解题思路方法一:迭代假设存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3。在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在原创 2020-08-01 16:57:37 · 154 阅读 · 1 评论 -
28.实现 strStr()
28. 实现 strStr()实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = “hello”, needle = “ll”输出: 2示例 2:输入: haystack = “aaaaa”, needle = “bba”输出: -1说明:当 needle 是空字符串时,我们应当返回什原创 2020-07-23 18:38:37 · 210 阅读 · 0 评论 -
8. 字符串转换整数 (atoi)
8. 字符串转换整数 (atoi)请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。注意:假如该字符原创 2020-07-23 18:11:11 · 377 阅读 · 0 评论 -
242. 有效的字母异位词
242. 有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t是否是 s 的字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false说明:你可以假设字符串只包含小写字母。进阶:如果输入字符串包含unicode字符怎么办?你能否调整你的解法来应对这种情况?解题思路假设字符串只包含小写字母,可以利用ASCII值进行求解。方法一:利用数组计原创 2020-07-22 16:54:41 · 128 阅读 · 0 评论 -
387. 字符串中的第一个唯一字符
387. 字符串中的第一个唯一字符给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = “leetcode”返回 0s = “loveleetcode”返回 2提示:你可以假定该字符串只包含小写字母。解题思路方法一:使用散列表(HashMap)这道题最优的解法就是线性复杂度了,为了保证每个元素是唯一的,至少得把每个字符都遍历一遍。算法的思路就是遍历一遍字符串,然后把字符串中每个字符出现的次数保存在一个散列表中。这个过程的时间复杂度原创 2020-07-22 15:59:44 · 167 阅读 · 0 评论 -
7. 整数反转
整数反转给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [ -2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。解题思路思路一:数学首先我们想一下,怎么去反转一个整数?用栈?或者把整数变成字符串,再去反转这个字符串?.原创 2020-07-22 15:29:11 · 285 阅读 · 0 评论 -
283. 移动零
283. 移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。解题思路 – 双指针思路一:两次遍历我们创建两个指针i和j,第一次遍历的时候指针j用来记录当前有多少非0元素。即遍历的时候每遇到一个非0元素就将其往数组左边挪,第一次遍历完后,j指针的下标就指向了最后一个非0元素下标。第二次遍历的时候,起始原创 2020-07-20 12:46:48 · 193 阅读 · 0 评论 -
66. 加一
66. 加一给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。解题思路根据题意加一,没错就是加一这很重要,因为它是只加一的所以有可能的情况就只有两种:除 9原创 2020-07-17 22:19:02 · 150 阅读 · 0 评论 -
350. 两个数组的交集 II
350. 两个数组的交集 II给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果的顺序。进阶:如果给定的数组已经排好序呢?你将如何优化你的算法?如果 nums1 的大小比 nums2原创 2020-07-17 21:35:01 · 206 阅读 · 0 评论 -
136. 只出现一次的数字
136. 只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4大脑的思考过程这题拿到手,第一反应是用hash表,没有思考细节,只是觉得hash表肯定是可以搞定的,但是空间复杂度是 O(n)O(n)O(n),不满足题意。接着开始思考,如何才能做到空间复原创 2020-07-17 16:45:32 · 316 阅读 · 0 评论 -
217. 存在重复元素
给定一个整数数组,判断是否存在重复元素。如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true解题思路方法三:哈希表 【通过】直觉利用支持快速搜索和插入操作的动态数据结构。算法从方法一中我们知道,对无序数组的查找操作的时间复杂度为原创 2020-07-17 16:04:55 · 156 阅读 · 0 评论 -
189. 旋转数组
189. 旋转数组给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入: [-1,-100,3,99] 和 k = 2输出: [3,99,-1,-100]解释:向右旋转 1 步: [99,-原创 2020-07-16 22:24:14 · 223 阅读 · 0 评论 -
392. 判断子序列 -- 双指针
392. 判断子序列给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例 1:s = "abc", t = "ahbgdc"返回 true.示例 2:s = "axc",原创 2020-07-14 22:17:36 · 181 阅读 · 0 评论 -
215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4题解方法二:借助 partition 操作定位到最终排定以后索引为 len - k 的那个元素以下的描述基于 “快速排序” 算法知识的学习,如果忘记的朋友们可以翻一翻自己的《数据结构与算法》教材,复习一下,pa原创 2020-07-06 16:13:29 · 1724 阅读 · 0 评论 -
709. 转换成小写字母
实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。示例 1:输入: "Hello"输出: "hello"示例 2:输入: "here"输出: "here"示例 3:输入: "LOVELY"输出: "lovely"解题思路一:使用Ascii码小写字母:65-90大写字母:97-122差值为32.关键步骤:字符和Acsii码的转换int ascii = (int) str.charAt(i);原创 2020-06-12 19:40:05 · 185 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度
通常,对于一个给定的算法,我们要做 两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。因此,作为程序员,掌握基本的算法时间复杂度分析方法是很有必要的。算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。而度量一个程序的执行时间通常有两种方法。1、事后统计的方原创 2020-06-07 12:25:59 · 323 阅读 · 0 评论 -
392. 判断子序列
给定字符串s和t ,判断s是否为t的子序列。你可以认为s和t 中仅包含英文小写字母。字符串t可能会很长(长度 ~= 500,000),而`` 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例 1:s = "abc", t = "ahbgdc"返回true.示例 2:s = "axc", t = "ahbgdc"返回false.cl原创 2020-06-04 22:19:47 · 168 阅读 · 0 评论 -
Python-快速排序
快速排序的介绍快速排序(quick sort)的采用了分治的策略。分治策略指的是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。快排的基本思想是:在序列中找一个划分值,通过一趟排序将未排序的序列排序成 独立的两个部分,其中左边部分序列都比划分值小,右边部分的序列比划分值大,此时划分值的位置已确认,然后再对这两个序列按照同样的方法进行排序,从而达到整个序列都有序的目的。快速排序的Python实现先来看一个 我更想称之为伪快排原创 2020-06-04 21:26:28 · 543 阅读 · 0 评论 -
628. 三个数的最大乘积
三个数的最大乘积给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。示例 1:输入: [1,2,3]输出: 6示例 2:输入: [1,2,3,4]输出: 24注意:给定的整型数组长度范围是[3,10^4],数组中所有的元素范围是[-1000, 1000]。输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。解方法一:排序法(1)对数组进...原创 2020-04-15 21:20:12 · 214 阅读 · 0 评论 -
448. 找到所有数组中消失的数字
找到所有数组中消失的数字给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6...原创 2020-04-14 21:55:25 · 193 阅读 · 0 评论 -
排序算法(选择排序法、插入排序)
排序算法我们关注的主要对象是重新排列数组元素的算法。大多情况下,我们的排序代码通常只会通过两个方法操作数据:less()方法对元素进行比较exch()方法将元素交换位置排序算法类的模板:public class Example{ /** * 排序算法 * @param a */ public static void sort(Comparab...原创 2019-12-28 17:01:35 · 222 阅读 · 0 评论 -
Python-二分查找法
from typing import Listclass BinarySearch: @staticmethod def rank(nums:List[int],key:int): ''' 二分查找法 找到则返回索引,找不到返回-1 :param nums: :param key: ...原创 2019-12-27 16:06:19 · 174 阅读 · 0 评论 -
Python-斐波那契数列
'''问题描述:无穷数列1,1,2,3,5,8,13,21,34,55...给定数字N,输出第N位的数字。'''def fib(n:int): ''' 递归实现 :param n: :return: ''' if n <= 2: return 1 return fib(n-1) + fib(n-2)def...原创 2019-12-27 15:41:29 · 283 阅读 · 0 评论