LeetCode100 - 寻找重复数
📝 题目描述 题目链接:寻找重复数 给定一个包含 n + 1 个整数的数组 nums,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数,返回 这个重复的数。 你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1)O(1)O(1) 的额外空间。 示例: 1234567891011121314示例 1:输入:nums = [1,3,4,2,2]输出:2示例 2:输入:nums = [3,1,3,4,2]输出:3示例 3 :输入:nums = [3,3,3,3,3]输出:3 提示: 1 <= n <= 10^5 nums.length == n + 1 1 <= nums[i] <= n nums 中只有一个整数出现两次或多次,其余整数均只出现一次 💡 解题思路 方法一:快慢指针 这道题的关键,是把数组中的重复数转化为链表的环入口,这样就能使用 Floyd 快慢指针算法解决问题。我们约定 每个下标 i 是一个节点,nums[i] 是它指向的下一个节点。也就是说,链表里通...
LeetCode99 - 下一个排列
📝 题目描述 题目链接:下一个排列 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr = [1,2,3],以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。 例如,arr = [1,2,3] 的下一个排列是 [1,3,2]。 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2]。 而 arr = [3,2,1] 的下一个排列是 [1,2,3],因为 [3,2,1] 不存在一个字典序更大的排列。 给你一个整数数组 nums,找出 nums 的下一个排列。 必须 原地 修改,只允许使用额外常数空间。 示例: 1234567891011121314示例 1:输入:nums = [1,2,3]输出:[1,3...
LeetCode98 - 颜色分类
📝 题目描述 题目链接:颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数的情况下解决这个问题。 示例: 1234567891011121314151617181920示例 1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]解释:该数组包含两个 0、两个 1 和两个 2。将它们原地排序后,所有 0 排在最前面,接着是所有 1,最后是所有 2。示例 2:输入:nums = [2,0,1]输出:[0,1,2]解释:数组中有且仅有一个 0、一个 1 和一个 2,按 0、1、2 的顺序原地排列。 提示: n == nums.length 1 <= n <= 300 nums[i] 为 0、1 或 2 💡 解题思路 方法一:计数排序 计数排序,很直观、很容易想到的方法。反正就三个数字“0、1、2”,最后无非就是给这三个数字排序。因此我们可以先扫描...
LeetCode97 - 多数元素
📝 题目描述 题目链接:多数元素 给定一个大小为 n 的数组 nums,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例: 123456789示例 1:输入:nums = [3,2,3]输出:3示例 2:输入:nums = [2,2,1,1,1,2,2]输出:2 提示: n == nums.length 1 <= n <= 5 * 10^4 -10^9 <= nums[i] <= 10^9 输入保证数组中一定有一个多数元素。 💡 解题思路 方法一:哈希表 最容易想到的方法,我们用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。在这之后,我们遍历哈希映射中的所有键值对,返回值大于⌊ n/2 ⌋。 也可以在遍历数组 nums 时候,“++”完立刻比较并维护最大的值,这样省去了最后对哈希映射的遍历。 方法二:排序 如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为 ⌊n2⌋\lfloor \frac{n}{2} \r...
LeetCode96 - 只出现一次的数字
📝 题目描述 题目链接:只出现一次的数字 给你一个 非空 整数数组 nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例: 1234567891011121314151617示例 1 :输入:nums = [2,2,1]输出:1示例 2 :输入:nums = [4,1,2,1,2]输出:4示例 3 :输入:nums = [1]输出:1 提示: 1 <= nums.length <= 3 * 10^4 -3 * 10^4 <= nums[i] <= 3 * 10^4 除了某个元素只出现一次以外,其余每个元素均出现两次。 💡 解题思路 方法一:位运算 使用位运算。对于这道题,可使用异或运算 ⊕⊕⊕。异或运算有以下三个性质。 任何数和 000 做异或运算,结果仍然是原来的数,即 a⊕0=aa⊕0=aa⊕0=a。 任何数和其自身做异或运算,结果是 000,即 a⊕a=0a⊕a=0a⊕a=0。 异或运算满足交换律和结合律,即 a⊕b⊕...
LeetCode95 - 编辑距离
📝 题目描述 题目链接:编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例: 12345678910111213141516171819示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例 2:输入:word1 = "intention", word2 = "execution"输出:5解释:intention -> inention (删除 't')inention -> enention (将 'i' 替换为 ...
LeetCode94 - 最长公共子序列
📝 题目描述 题目链接:最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列,返回 0。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。 示例: 1234567891011121314151617示例 1:输入:text1 = "abcde", text2 = "ace" 输出:3 解释:最长公共子序列是 "ace" ,它的长度为 3 。示例 2:输入:text1 = "abc", text2 = "abc"输出:3解释:最长公共子序列是 "abc"...
LeetCode93 - 最长回文子串
📝 题目描述 题目链接:最长回文子串 给你一个字符串 s,找到 s 中最长的回文子串。 回文性:如果字符串向前和向后读都相同,则它满足回文性。 子字符串:字符串中连续的非空字符序列。 示例: 12345678910示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb" 提示: 1 <= s.length <= 1000 s 仅由数字和英文字母组成 💡 解题思路 方法一:动态规划 对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 “ababa”,如果我们已经知道 “bab” 是回文串,那么 “ababa” 一定是回文串,这是因为它的首尾两个字母都是 “a”。 我们令 P(i,j) 表示字符串 s 的第 i 到 j 个字母组成的串是否为回文串,则我们就可以写出动态规划的状态转移方程: P(i,j)=P(i+...
LeetCode92 - 最小路径和
📝 题目描述 题目链接:最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 12345678910示例 1:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。示例 2:输入:grid = [[1,2,3],[4,5,6]]输出:12 提示: m == grid.length n == grid[i].length 1 <= m, n <= 200 0 <= grid[i][j] <= 200 💡 解题思路 方法一:动态规划 由于路径的方向只能是向右或向下,因此网格的第一行的每个元素只能从左上角元素开始向右移动到达,网格的第一列的每个元素只能从左上角元素开始向下移动到达,此时的路径是唯一的,因此每个元素对应的最小路径和即为对应的路径上的数字总和。 对于不在第一行和第一列的元素,可以从其左方相邻元素向右移动一步到达,或者从其上方相邻元素向下移动一步到达,...
LeetCode91 - 不同路径
📝 题目描述 题目链接:不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示例: 123456789101112131415161718192021222324示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右3. 向下 -> 向右 -> 向下示例 3:输入:m = 7, n = 3输出:28示例 4:输入:m = 3, n = 3输出:6 提示: 1 <= m, n <= 100 题目数据保证答案小于等于 2 * 10^9 💡 解题思路 方法一:动态规划 我们用 f(i,j) 表示从左上角走到 (i,j) 的路径数量,其中 i 和 j 的范围分别是 [0,m) 和 [0,n...