面试经典-合并区间
合并区间题目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,5]]输出:[[1,5]]解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。 提示: 1 <= intervals.length <= 104 intervals[i].length == 2 0 <= starti <= endi <= 104 题解题解一(排序法)123456789101112131415public int[][] merge(int[][] interval...
面试经典-汇总区间
汇总区间题目228. 汇总区间 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按如下格式输出: "a->b" ,如果 a != b "a" ,如果 a == b 示例 1: 输入:nums = [0,1,2,4,5,7]输出:[“0->2”,”4->5”,”7”]解释:区间范围是: [0,2] –> “0->2” [4,5] –> “4->5” [7,7] –> “7” 示例 2: 输入:nums = [0,2,3,4,6,8,9]输出:[“0”,”2->4”,”6”,”8->9”]解释:区间范围是: [0,0] –...
面试经典-最长连续序列
最长连续序列题目128. 最长连续序列 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。 示例 2: 输入:nums = [0,3,7,2,5,8,4,6,0,1]输出:9 提示: 0 <= nums.length <= 105 -109 <= nums[i] <= 109 题解 排序后,滑动窗口解题,挺简单的 12345678910111213141516171819202122232425262728public static int longestConsecutive(int[] nums) { if (nums.length == 0) return 0; int max = 0; int temp = 1; A...
面试经典-存在重复元素II
存在重复元素II题目219. 存在重复元素 II 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。 示例 1: 输入:nums = [1,2,3,1], k = 3输出:true 示例 2: 输入:nums = [1,0,1,1], k = 1输出:true 示例 3: 输入:nums = [1,2,3,1,2,3], k = 2输出:false 提示: 1 <= nums.length <= 105 -109 <= nums[i] <= 109 0 <= k <= 105 题解题解一(暴力法)123456789101112public static boolean containsNearbyDuplicate(int[] nums, int k) { for ...
面试经典-字母异位词分组
字母异位词分组题目49. 字母异位词分组 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 12输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]] 示例 2: 12输入: strs = [""]输出: [[""]] 示例 3: 12输入: strs = ["a"]输出: [["a"]] 提示: 1 <= strs.length <= 104 0 <= strs[i].length <...
面试经典-长度最小的子数组
长度最小的子数组题目209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 123输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。 示例 2: 12输入:target = 4, nums = [1,4,4]输出:1 示例 3: 12输入:target = 11, nums = [1,1,1,1,1,1,1,1]输出:0 提示: 1 <= target <= 109 1 <= nums.length <= 105 1 <= nums[i] <= 104 进阶: 如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。 题解题解一(暴力法)123456...
面试经典-三数之和
面试经典-三数之和题目15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1: 12345678输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]解释:nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。注意,输出的顺序和三元组的顺序并不重要。 示例 2: 123输入:nums = [0,1,1]输出:[]解释:唯一可能的三元组和不为 0 。 ...
面试经典-文本左右对齐
文本左右对齐题目68. 文本左右对齐 给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' ' 填充,使得每行恰好有 maxWidth 个字符。 要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。 文本的最后一行应为左对齐,且单词之间不插入额外的空格。 注意: 单词是指由非空格字符组成的字符序列。 每个单词的长度大于 0,小于等于 maxWidth。 输入单词数组 words 至少包含一个单词。 示例 1: 1234567输入: words = ["This", "is", "an", "example", "of", "text", "justification."],...
面试经典-两数之和II_输入有序数组
两数之和II_输入有序数组题目167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。 以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。 你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。 你所设计的解决方案必须只使用常量级的额外空间。 示例 1: 输入:numbers = [2,7,11,15], target = 9输出:[1,2]解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。 示例 2: 输入:numbers = [2,3,4]...
面试经典-Z字形变换
Z字形变换题目详解Z 字形变换 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P A H NA P L S I I GY I R 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。 请你实现这个将字符串进行指定行数变换的函数: string convert(string s, int numRows); 示例 1: 输入:s = “PAYPALISHIRING”, numRows = 3输出:”PAHNAPLSIIGYIR” 示例 2: 输入:s = “PAYPALISHIRING”, numRows = 4输出:”PINALSIGYAHRPI”解释:P I NA L S I GY A H RP I 示例 3: 输入:s = “A”, numR...
面试经典-最长公共前缀
最长公共前缀题目详情最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串""。 示例 1: 输入:strs = [“flower”,”flow”,”flight”]输出:”fl” 示例 2: 输入:strs = [“dog”,”racecar”,”car”]输出:””解释:输入不存在公共前缀。 提示: 1 <= strs.length <= 200 0 <= strs[i].length <= 200 strs[i] 仅由小写英文字母组成 题解 此题主要理解题干中的公共前缀, 例如 “flower”,”flow”,”flight” 最长公共前缀为 “fl” “bflower”, “afow”, “bflight” 就没有最长公共前缀 ,最长公共前缀为 “” 理解到这一层,此题也就迎刃而解了。 123456789101112131415161718192021222324252627class Solution { public...
最后一个单词的长度
最后一个单词的长度题目详情58. 最后一个单词的长度 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s = “Hello World”输出:5解释:最后一个单词是“World”,长度为 5。 示例 2: 输入:s = “ fly me to the moon “输出:4解释:最后一个单词是“moon”,长度为 4。 示例 3: 输入:s = “luffy is still joyboy”输出:6解释:最后一个单词是长度为 6 的“joyboy”。 提示: 1 <= s.length <= 104 s 仅有英文字母和空格 ' ' 组成 s 中至少存在一个单词 题解此题比较简单,建议自己动手 123456789101112public static int lengthOfLastWord(String s) { String trim = s....
面试经典-O(1)时间插入、删除和获取随机元素
O(1)时间插入、删除和获取随机元素 题解题目详情 实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象 bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。 bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。 int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。 你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。 示例: 输入[“RandomizedSet”, “insert”, “remove”, “insert”, “getRandom”, “remove”, “insert”, “getRandom”][[], [1], [2], [2], [], [1], [2], []]输出[null, true, false, true, 2, tr...
面试经典-除自身以外数组的乘积
除自身以外数组的乘积 题解题目详情 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度内完成此题。 示例 1: 输入: nums = [1,2,3,4]输出: [24,12,8,6] 示例 2: 输入: nums = [-1,1,0,-3,3]输出: [0,0,9,0,0] 提示: 2 <= nums.length <= 105 -30 <= nums[i] <= 30 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内 进阶:你可以在 O(1) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。) 解题思路与题解 此题题目已经很明确了,解题思路,我主要推荐空间换时间 题解一当然,老套路,这种题的暴力解法 1...
面试经典-H指数
H指数 题解题目详情 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值,**h 指数** 是其中最大的那个。 示例 1: 输入:citations = [3,0,6,1,5]输出:3解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。 由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。 示例 2: 输入:citations = [1,3,1]输出:1 提示: n == citations.length 1 <= n <= 5000 0 <= citations[i] <= 1000 解题思路与题解 h 指数 是...
面试经典-跳跃游戏II
跳跃游戏II 题解题目详情 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处: 0 <= j <= nums[i] i + j < n 返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。 示例 1: 输入: nums = [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 示例 2: 输入: nums = [2,3,0,1,4]输出: 2 提示: 1 <= nums.length <= 104 0 <= nums[i] <= 1000 题目保证可以到达 nums[n-1] 解题思路与题解 题目中明确告诉们可以到 nums[n-1] 的位置,所以我们不需要...
面试经典-跳跃游戏I
跳跃游戏I 题解题目详情 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1: 输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。 示例 2: 输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。 提示: 1 <= nums.length <= 104 0 <= nums[i] <= 105 题解题目重要内容解析: 首先,我们要注意,题干中的 你最初位于数组的 第一个下标 和 可以跳跃的最大长度,这句话非常关键,也就是说,我们在一个数组中,我们首先会跳到 nums[0] 对应的值的 对应的下标,也就是说我们最开始其实是位于 nums[nums[0...
面试经典-买卖股票的最佳时机II
买卖股票的最佳时机II 题解题目详情 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得的 最大 利润 。 示例 1: 输入:prices = [7,1,5,3,6,4]输出:7解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。总利润为 4 + 3 = 7 。 示例 2: 输入:prices = [1,2,3,4,5]输出:4解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这...
面试经典-买卖股票的最佳时机
买卖股票的最佳时机I 题解题目详情 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 示例 1: 输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。 示例 2: 输入:prices = [7,6,4,3,1]输出:0解释:在这种情况下, 没有交易完成, 所以最大利润为 0。 提示: 1 <= prices.length <= 105 0 <= prices[i] <= 104 题解 题目重要内容解析: 只能进行一次买卖 首先我们...
面试经典-轮转数组
轮转数组 的题解题目详情 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 123456输入: nums = [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: 12345输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]解释: 向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100] 提示: 1 <= nums.length <= 105 -231 <= nums[i] <= 231 - 1 0 <= k <= 105 进阶: 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? 首先暴力求解法1234567891011...
