Leetcode和剑指Offer
文章平均质量分 59
Leetcode、面试题、剑指Offer
龙叔的技术笔记
后端程序员一枚
展开
-
Leetcode 1679. K 和数对的最大数目 双指针法
给你一个整数数组 nums 和一个整数 k。每一步操作中,你需要从数组中选出和为 k 的两个整数,并将它们移出数组。返回你可以对数组执行的最大操作数。示例 1:输入:nums = [1,2,3,4], k = 5输出:2示例 2:输入:nums = [3,1,3,4,3], k = 6输出:1。原创 2023-05-26 08:23:03 · 714 阅读 · 0 评论 -
LeetCode213 打家劫舍 II 动态规划法
此题是 198. 打家劫舍 的拓展版: 唯一的区别是此题中的房间是 环状排列 的(即首尾相接),而 198 题中的房间是 单排排列 的;而这也是此题的难点。如果偷第 i 个房间,意味着跳过了 第 i -1个房间,金额等于前两个步骤的金额 dp[i-2] 加上第 i 个房间;前 0 间房子的最大偷窃价值为 dp1[0]=nums[0] ,,不能偷窃相邻房间因此 dp1[1] = dp1[0]解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。原创 2023-04-24 20:17:07 · 392 阅读 · 0 评论 -
LeetCode122 买卖股票的最佳时机 II 贪心算法
题目链接 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润。示例 1:输入:prices = [7,1,5,3,6,4]输出:7。原创 2023-04-24 17:05:10 · 224 阅读 · 0 评论 -
LeetCode121 买卖股票的最佳时机 遍历法和动态规划
题目地址:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0。示例 1:输入:[7,1,5,3,6,4]输出:5。原创 2023-04-24 15:30:36 · 384 阅读 · 0 评论 -
LeetCode154 寻找旋转排序数组中的最小值 II
注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]]。已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。请你找出并返回数组中的 最小元素。若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]输入:nums = [2,2,2,0,1]输入:nums = [1,3,5]原创 2023-04-16 18:55:54 · 334 阅读 · 0 评论 -
Leetcode394 字符串解码 递归和非递归
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。输入:s = “2[abc]3[cd]ef” 输出:“abcabccdcdcdef”输入:s = “abc3[cd]xyz” 输出:“abccdcdcdxyz”输入:s = “3[a2[c]]” 输出:“accaccacc”输入:s = “3[a]2[bc]” 输出:“aaabcbc”给定一个经过编码的字符串,返回它解码后的字符串。原创 2023-04-13 15:13:56 · 523 阅读 · 0 评论 -
LeetCode77 组合 - 递归实现
熟悉我的读者朋友都知道,我是面向思维做题,做题是为了保持时间复杂度、空间复杂度的敏感,顺便锻炼一下脑筋,把思维用代码表达出来。题目的解法不止一种,一般记住一两种就差不多了。我的选择标准是:思路简单,代码清晰题目链接给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1:输入:n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]示例.原创 2022-02-19 14:54:52 · 370 阅读 · 0 评论 -
LeetCode11 盛最多水的容器 双指针法
思路简单,代码清晰。题目链接:https://leetcode-cn.com/problems/container-with-most-water给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49 解释:图.原创 2022-02-13 00:10:09 · 184 阅读 · 0 评论 -
LeetCode167 两数之和 II - 输入有序数组 双指针的运用
链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。你可以假原创 2022-02-06 15:54:24 · 366 阅读 · 0 评论 -
LeetCode15 三数之和 双指针法
链接:https://leetcode-cn.com/problems/3sum给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]原创 2022-02-05 15:31:56 · 578 阅读 · 0 评论 -
LeetCode1248 统计「优美子数组」 前缀和的方法
再次分享一道前缀和的题目可以说它在 560. 和为 K 的子数组 前缀和的运用 上面套了壳本质都是计算前缀和数组,然后用 Map 优化访问效率。链接:https://leetcode-cn.com/problems/count-number-of-nice-subarrays给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。请返回这个数组中 「优美子数组」 的数目。示例 1:输入:nums = [1,1,2,1,1]原创 2022-02-04 13:40:20 · 871 阅读 · 0 评论 -
LeetCode42接雨水 暴力法和双指针
链接:https://leetcode-cn.com/problems/trapping-rain-water给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2:输入:height = [4,2,0,原创 2022-02-03 15:32:14 · 6446 阅读 · 0 评论 -
560. 和为 K 的子数组 前缀和的运用
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。示例 1:输入:nums = [1,1,1], k = 2输出:2示例 2:输入:nums = [1,2,3], k = 3输出:2示例 3:输入:nums = [1,0,1], k = 1输出:4提示:1 <= nums.length <= 2 * 10^原创 2022-02-02 16:05:00 · 526 阅读 · 0 评论 -
LeetCode215 数组中的第K个最大元素
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array给定整数数组 nums 和整数 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题目分析这道题,实际上就是考排序算法。对数组从大原创 2022-02-01 20:53:38 · 201 阅读 · 0 评论 -
1109. 航班预订统计 差分思想的运用
链接:https://leetcode-cn.com/problems/corporate-flight-bookings这里有 n 个航班,它们分别从 1 到 n 进行编号。有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。请你返回一个长度为 n 的数组 answer,里面的元素是每个航原创 2022-02-01 00:48:31 · 615 阅读 · 0 评论 -
155. 最小栈
题目链接:https://leetcode-cn.com/problems/min-stack设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0原创 2022-01-23 17:36:15 · 117 阅读 · 0 评论 -
20. 有效的括号
今天分享一道简单题,跟栈相关的题目链接:https://leetcode-cn.com/problems/valid-parentheses给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4原创 2022-01-16 16:06:25 · 167 阅读 · 0 评论 -
链表是否有环,以及环的位置
介绍两道算法题,与环形链表有关。LeetCode 141. Linked List Cycle(Easy)LeetCode 142. Linked List Cycle II(Medium)这两道题有连续性,第一道判断单链表是否有环,第二道是找到环形链表成环的节点,返回该节点的引用。环形链表给定一个链表,判断链表中是否有环。示例:输入:head = [3,2,0,-4] 输出:true解释:链表中有一个环,其尾部连接到第二个节点。思路这道题有两个解法,哈希表和快慢指针原创 2022-01-09 15:29:40 · 735 阅读 · 0 评论 -
25. K 个一组翻转链表
今天介绍一道 hard 级别的题目链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group1 题目描述:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。示例1输入:head =原创 2022-01-09 14:08:20 · 76 阅读 · 0 评论 -
154. 寻找旋转排序数组中的最小值 II
链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]原创 2021-12-21 00:54:19 · 98 阅读 · 0 评论 -
283. 移动零
链接:https://leetcode-cn.com/problems/move-zeroes给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。题目分析:其实题目说的很清楚了,把0全部挪到后面去。要求是不能开辟新数组。这道题和【 26. 删除有序数组中的重复项】类似定义快慢指针,快指针用于遍历数组,慢指针用来做原创 2021-12-19 22:11:09 · 188 阅读 · 0 评论 -
26. 删除有序数组中的重复项
题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想原创 2021-12-19 21:25:53 · 66 阅读 · 0 评论 -
328. 奇偶链表
题目链接:https://leetcode-cn.com/problems/odd-even-linked-list/给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->原创 2021-12-17 01:37:57 · 137 阅读 · 0 评论 -
88. 合并两个有序数组
题目链接:https://leetcode-cn.com/problems/merge-sorted-array/给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m个元素表示应合并的元原创 2021-12-08 01:23:17 · 85 阅读 · 0 评论 -
21. 合并两个有序链表
题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]思路:题目的基础是遍历单链表,在此基原创 2021-12-08 01:05:46 · 93 阅读 · 0 评论 -
66. 加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入:digits = [1,2,3]输出:[1,2,4]解释:输入数组表示数字 123。题目链接:https://leetcode-cn.com/problems/plus-one/题目意思:给你一个正整数数组,对它进行加法运算,加一。数组最后一个元素看成个位,加一肯定是先操作最后一个元素。加的原创 2021-12-06 00:18:17 · 156 阅读 · 0 评论 -
23 合并k个升序列表
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6题目链接:https://leetcode原创 2021-12-05 22:59:30 · 140 阅读 · 0 评论 -
78. 子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]题目链接:https://leetcode-cn.com/problems/subsets/方法:二进制判断 + 迭代思路:用一个 n 位二进制数标记哪些元素将构成子集,其中 n 是原数组的长度。实现:clas原创 2021-12-05 20:58:35 · 84 阅读 · 0 评论 -
239. 滑动窗口最大值-单调栈
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 3 1原创 2021-12-04 16:18:09 · 99 阅读 · 0 评论 -
53. 最大子数组和
题目链接:https://leetcode-cn.com/problems/maximum-subarray/给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。1 暴力法 O(n3)思路:连续子数组的和 = 左端点 到 右端点之间的和先固定左端点,再固定原创 2021-12-02 01:42:55 · 279 阅读 · 0 评论 -
88 合并两个有序数组
题目链接:https://leetcode-cn.com/problems/merge-sorted-array/分析:给定两非递减的数组,把排序后的结果合并到第一个数组思路:对第一个数组进行遍历,两个数组,谁大就先填入谁代码:func merge(nums1 []int, m int, nums2 []int, n int) { i := m -1 j := n - 1 for k:= m + n -1; k >=0; k-- { if j <原创 2021-12-01 01:06:02 · 357 阅读 · 0 评论 -
84. 柱状图中最大的矩形
题目:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/目的:找到面积最大的矩形面积 = 高度 * 宽度高度确定,宽度不确定1 暴力穷举法思路:双指针。1.1 左指针向左移动,直到第一个比自己矮的矩形1.2 右指针向右移动,直到第一个比自己矮的矩形class Solution { public int largestRectangleArea(int[] heights) {原创 2021-11-29 00:24:37 · 132 阅读 · 0 评论