![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法笔记
目标LeetCode一千题
ProMan_XY
这个作者很懒,什么都没留下…
展开
-
剑指Offer-学习计划(八)查找算法(下)
考点:关于查找算法,分类其实还挺多的,比如二分查找,顺序查找,插值查找,树表查找,哈希查找等,实际上日常编码也会接触到,可以借用他们的思想给我们的编码过程带来更好的体验,这几道题里面最多的用到的就是二分、顺序和哈希了,顺序和哈希一般考点不会太深主要是二分查找。注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。原创 2023-08-28 12:30:00 · 107 阅读 · 0 评论 -
剑指Offer-学习计划(七)查找算法(上)
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。解法三:数据结构解法标答,用解法二和三都可以,让人知道你会用算法和结构解决问题。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。剑指 Offer 53 - II. 0~n-1中缺失的数字。输入: [0,1,2,3,4,5,6,7,9]原创 2023-08-22 11:55:04 · 213 阅读 · 0 评论 -
剑指Offer-学习计划(六)模拟
例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。输出:[1,2,3,4,8,12,11,10,9,5,6,7]输出:[1,2,3,6,9,8,7,4,5]原创 2023-08-11 17:43:45 · 289 阅读 · 0 评论 -
剑指Offer-学习计划(五)栈与队列
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。解法:这道题很简单,首先把我们常用的Node节点实现出来,之后按照所需方法逐个实现即可,注意节点里面该有的val,min,next这些都要有。2. 他们也是源自数组和链表的一种延伸结构,比如数组实现的栈成为顺序栈,链表实现的栈成为链式栈。1. 栈和队列本身都属于限制型的数据结构,有各自的定义,也有可以混淆的部分。队列的声明如下,请实现它的两个函数。原创 2023-08-04 10:08:14 · 146 阅读 · 0 评论 -
剑指Offer-学习计划(四)双指针(下)
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。例如输入字符串"I am a student. ",则输出"student. a am I"。输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。输入:nums = [10,26,30,31,47,60], target = 40。输入:nums = [2,7,11,15], target = 9。原创 2023-07-28 10:51:36 · 371 阅读 · 0 评论 -
剑指Offer-学习计划(三)双指针(上)
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3。输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。原创 2023-07-20 11:39:28 · 82 阅读 · 0 评论 -
剑指Offer-学习计划(二)链表篇
考点:1. 链表的考点太多了主要就是玩指针,指针明白了就没啥可看的2. 双指针也可以算是指针的经典算法,虽然也能玩数组吧3. 可以套用一些现有的结构处理比较复杂的问题,比如LinkedList之类的题目一:从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:[2,3,1]解法一:求个长度用来newArray,之后顺序遍历链表 ,数组反向接收即可不愿意循环求长度也可以直接上List转成数组=null){len++;=null){原创 2023-07-13 11:32:50 · 164 阅读 · 0 评论 -
算法笔记(215. 数组中的第K个最大元素)
算法原创 2023-02-17 09:48:15 · 118 阅读 · 0 评论 -
算法笔记(1221. 分割平衡字符串、1528. 重新排列字符串、1374. 生成每种字符都是奇数个的字符串)
字符串相关原创 2022-10-31 11:58:19 · 1108 阅读 · 0 评论 -
算法笔记(1455. 检查单词是否为句中其他单词的前缀)
双指针原创 2022-10-24 08:00:00 · 1269 阅读 · 0 评论 -
算法笔记(884. 两句话中的不常见单词,804. 唯一摩尔斯密码词,482. 密钥格式化,409. 最长回文串)
字符串算法笔记原创 2022-09-23 13:28:47 · 1256 阅读 · 0 评论 -
算法笔记(540有序数组中的单一元素)
二分查找原创 2022-07-26 13:25:42 · 2244 阅读 · 0 评论 -
算法笔记(209. 长度最小的子数组)
二分查找原创 2022-07-22 17:54:00 · 2206 阅读 · 0 评论 -
算法笔记(69. x 的平方根 和744. 寻找比目标字母大的最小字母)
算法笔记,二分查找原创 2022-07-13 17:41:06 · 2295 阅读 · 0 评论 -
算法笔记(1385. 两个数组间的距离值)
1385. 两个数组间的距离值原创 2022-07-07 09:32:55 · 2649 阅读 · 0 评论 -
算法笔记(367. 有效的完全平方数)
367. 有效的完全平方数原创 2022-07-07 09:29:04 · 2265 阅读 · 0 评论 -
算法笔记(22. 括号生成)
题目:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:1 <= n <= 8https://leetcode.cn/problems/generate-parentheses/题解:public List<String> gene原创 2022-05-20 13:28:04 · 2303 阅读 · 0 评论 -
算法笔记(599. 两个列表的最小索引总和)
题目:假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。示例 1:输入: list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"],list2 = ["Piatti", "The Grill at Torrey Pines", "Hung原创 2022-04-18 13:24:29 · 2498 阅读 · 0 评论 -
算法笔记(485. 最大连续 1 的个数)
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 示例 2: 输入:nums = [1,0,1,1,0,1] 输出:2解法一:public int findMaxConsecutiveOnes2(int[] nums) { int n = nums.length; int count =..原创 2022-03-31 10:44:04 · 3021 阅读 · 0 评论 -
算法笔记(56. 合并区间)
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。示例 1:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入:intervals = [[1,4],[4.原创 2022-03-31 10:40:20 · 2496 阅读 · 0 评论 -
算法笔记(506. 相对名次)
题目: 506. 相对名次 给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。 运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况: 名次第 1 的运动员获金牌 "Gold Medal" 。 名次第 2 的运动员获银牌 "Silver Medal" 。 名次第 3 的运动员获铜牌 "Bronze Medal" 。 从名次第原创 2022-03-17 13:40:13 · 2764 阅读 · 0 评论 -
算法笔记(628. 三个数的最大乘积)
题目:628. 三个数的最大乘积给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。示例 1:输入:nums = [1,2,3]输出:6示例 2:输入:nums = [1,2,3,4]输出:24示例 3:输入:nums = [-1,-2,-3]输出:-6https://leetcode-cn.com/problems/maximum-product-of-three-numbers/解法一:首先对数组进行排序 ,然后比较大小,这块儿主要思考的就是原创 2022-03-17 13:34:45 · 2974 阅读 · 0 评论 -
算法笔记(645. 错误的集合)
题目:集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组 nums 代表了集合 S 发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。示例 1:输入:nums = [1,2,2,4]输出:[2,3]示例 2:输入:nums = [1,1]输出:[1,2]解法一:/** * 老版map解法 利用HashM原创 2022-03-11 10:33:21 · 2992 阅读 · 0 评论 -
算法笔记(283. 移动零)
题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例 1:输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]示例 2:输入: nums = [0]输出: [0]解法一:直接冒泡就出来了public void moveZeroes(int[] nums) { int n = nums.length; if .原创 2022-03-08 11:23:09 · 3174 阅读 · 0 评论 -
算法笔记(453. 最小操作次数使数组元素相等)
题目:给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。示例 1:输入:nums = [1,2,3]输出:3解释:只需要3次操作(注意每次操作会增加两个元素的值):[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]示例 2:输入:nums = [1,1,1]输出:0解法一:这属于数学的解法,可以但是并不推荐 public int minMo原创 2022-03-08 11:17:56 · 3279 阅读 · 0 评论 -
算法笔记(73.矩阵置零)
题目:给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。示例 1:输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]解法一:public void setZeroes(in.原创 2022-02-14 15:33:23 · 4044 阅读 · 0 评论 -
算法笔记(二叉树的最小深度和最大深度)
题目一:二叉树的最小深度解法:解决二叉树问题最好的方法永远是递归,其他的都是垃圾,这个解法未曾优化,怎么省事儿怎么来的 就是if else 判断一下 子节点是否为空 最后比较一下那边儿最小 不比较就崩了 public int minDepth(TreeNode root) { if (root == null)return 0; else if (root.left == null)return minDepth(root.right)+1; els原创 2021-10-25 11:02:59 · 5147 阅读 · 0 评论 -
算法笔记(二叉树的层序遍历 前向与后向)
题目一:二叉树的层序遍历(前向)解法:个人认为 破二叉树最好的方法就是递归 虽然还没写出来过双百的List<List<Integer>> list = new ArrayList<>(); public List<List<Integer>> levelOrder(TreeNode root) { dns(root,0); return list; } private void原创 2021-10-19 11:54:44 · 5266 阅读 · 0 评论 -
算法笔记(二叉树的前序 中序 后序遍历)
题目一:前序遍历解法一:递归public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); preOrder(root,list); return list;}private void preOrder(TreeNode root, List<Integer> list) { i原创 2021-10-09 11:50:50 · 5342 阅读 · 0 评论 -
算法笔记(爬楼梯和斐波那契数)
题目一:爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。解法:使用动态规划 这里的f(0)=1 f(1)=1 f(x) 和 f(x-1) f(x-2)有关系public static int climbStairs(int n) { int p,q = 0, r = 1; for (int i=0; i<n; i++){ p = q; ...原创 2021-09-28 11:30:01 · 5478 阅读 · 0 评论 -
算法笔记(两数之和与罗马数字转整数)
题目一:两数之和给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。代码:解法一:采用暴力拆解法 两层循环搞定,不得不说这种方法设计起来及其省事儿,除了效率低,没其他的缺点private int[] twoSum(int [] nums,int target){ in...原创 2021-09-22 16:26:30 · 5504 阅读 · 0 评论