随笔分类 - leetcode
面试刷题
摘要:快速排序 通过一趟排序将待排序记录划分(partition)成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以分别对着两部分记录继续进行排序,以达到整个序列有序。 代码实现 def quicksort(nums,left,right): if left>=right: retu
阅读全文
摘要:1.题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 示例 输入:nums = [2,7,11,15], ta
阅读全文
摘要:最小K个数 1. 题目描述 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 示例 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 2. 解题思路 方法一:先排序,取前k 代码
阅读全文
摘要:1. 题目描述 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格 [35, 37
阅读全文
摘要:1. 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许
阅读全文
摘要:题目描述 给你一个字符串 s,找到 s 中最长的回文子串。 示例 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 动态规划 对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 “ababa”,
阅读全文
摘要:题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 输入: [7,5,6,4] 输出: 5 归并排序与逆序对 合并阶段 本质上是 合并两个排序数组 的过程,而每当遇到 左子数组当前元素 > 右子数组当前元素 时
阅读全文
摘要:归并排序 归并排序就是先把左半边数组排好序,再把右半边数组排好序,然后把两半数组合并。 算法框架 // 定义:排序 nums[lo..hi] void sort(int[] nums, int lo, int hi) { if (lo == hi) { return; } int mid = (lo
阅读全文
摘要:题目描述 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 示例 输入;nums=[1,1,2] 输出2,nums=[1,2,_] 双指针 使用fast指针在前面探路,若遇到重复元素,则跳过
阅读全文
摘要:题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 示例 输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,3,0,4] 双指针 如果 fast 遇到需要去除的元素
阅读全文
摘要:问题描述 给你一个装载重量为 W 的背包和 N 个物品,每个物品有重量和价值两个属性。其中第 i 个物品的重量为 ,价值为 ,现在让你用这个背包装物品,最多能装的价值是多少? 示例 N = 3, W = 4 wt = [2, 1, 3] val = [4, 2,
阅读全文
摘要:题目描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 方法1-stupid 遍历所有链表将节点值加入列表中, 对列表进行升序 根据列表创建新的链表 代码实现 # 将所有链表元素添加至列表中,然后对列表进行排序,然后基于列表创建链表, d
阅读全文
摘要:##题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量 算法分析-双指针 初始状态:左右指针分别指向头、
阅读全文
摘要:题目描述 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 动态规划 本题与爬楼梯很相似,可以从最后一个组成面额的最后一个硬币考虑。例如组成面额5(dp[5])的最后一
阅读全文
摘要:题目描述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 输入:coins = [1, 2, 3], amoun
阅读全文
摘要:从贪心说起 我们知道贪心算法可以解决「硬币找零问题」,但是那只是在部分情况下可以解决而已。 那么有什么情况下不能用贪心算法吗?比如一个算法星球的央行发行了奇葩币,币值分别为{1、5、11},要凑够15元,这个时候贪心算法就失效了。 按照贪心算法的策略,我们先拿出最大面值的11,剩下的4个分别对应四个
阅读全文
摘要:回溯本质 解决一个 回溯问题,其实就是一个决策树的遍历问题,需要思考以下3个问题: 路径:已经做出的选择 选择列表:当前可以做的选择 结束条件:到达决策树底层,无法选择 代码框架 res = [] def backtrack(路径,选择列表): if 满足结束条件: res.add(路径) retu
阅读全文
摘要:题目描述 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 输入输出 输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"] 算法思想-回溯 使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操
阅读全文
摘要:题目描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 输入输出 思路分析 遇到统计可行路径的数量问题,或者求最小路径,一般有两种方法,搜索和动态规划。 注: 搜索一般在数据规模比较小的时候使用。复杂度比较高,在本题中: \(2
阅读全文
摘要:题目描述 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 输入输出 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 算法思想 这个问题可以看作有 n 个排
阅读全文