随笔分类 - leetcode
摘要:labuladong讲解 先使用简单的回溯算法解决问题 然后添加哈希表作为备忘录,解决回溯中的重叠子问题 最后通过推导得出状态转移,使用动态规划解决问题 494. 目标和(中等) 题目: 给你输入一个非负整数数组 nums 和一个目标值 target,现在你可以给每一个元素 nums[i] 添加正号
阅读全文
摘要:931. 下降路径最小和(中等) 输入为一个 n * n 的二维数组 matrix,请你计算从第一行落到最后一行,经过的路径和最小为多少。 就是说你可以站在 matrix 的第一行的任意一个元素,需要下降到最后一行。 每次下降,可以向下、向左下、向右下三个方向移动一格。也就是说,可以从 matrix
阅读全文
摘要:labuladong讲解 基本思想都是使用快慢指针,快指针去查找值,慢指针保存值 26. 删除有序数组中的重复项(简单) 思路: 我们让慢指针 slow 走在后面,快指针 fast 走在前面探路,找到一个不重复的元素就告诉 slow 并让 slow 前进一步。这样当 fast 指针遍历完整个数组 n
阅读全文
摘要:labuladong讲解 316. 去除重复字母(中等) 题目: 思路: 题目的要求总结出来有三点: 要求一、要去重。 要求二、去重字符串中的字符顺序不能打乱 s 中字符出现的相对顺序。 要求三、在所有符合上一条要求的去重字符串中,字典序最小的作为最终结果。 比如说输入字符串 s = "babc",
阅读全文
摘要:labuladong讲解 528. 按权重随机选择(中等) 题目: 思路: 对于[1,7],我们可以将其膨胀为长度为[1,7]的线段,而后产生[1,7]的int随机数x,当x落在1时返回0,当x落在2-7时返回1.实现等概率。 扩展的线段,可以用前缀和数组表示。 查找与x最接近的左侧数值时可以使用二
阅读全文
摘要:labuladong讲解 380. 常数时间插入、删除和获取随机元素(中等) 题目: 题目理解: 就是说就是让我们实现如下一个类: class RandomizedSet { public: /** 如果 val 不存在集合中,则插入并返回 true,否则直接返回 false */ bool ins
阅读全文
摘要:labuladong讲解 870. 优势洗牌(中等) 题目: 给你输入两个长度相等的数组 nums1 和 nums2,请你重新组织 nums1 中元素的位置,使得 nums1 的「优势」最大化。 如果 nums1[i] > nums2[i],就是说 nums1 在索引 i 上对 nums2[i] 有
阅读全文
摘要:labuladong讲解 410. 分割数组的最大值(困难) 题目: 题目讲解: 给你输入一个数组 nums 和数字 m,你要把 nums 分割成 m 个子数组。 肯定有不止一种分割方法,每种分割方法都会把 nums 分成 m 个子数组,这 m 个子数组中肯定有一个和最大的子数组对吧。 我们想要找一
阅读全文
摘要:labuladong讲解 代码框架 // 函数 f 是关于自变量 x 的单调函数 int f(int x) { // ... } // 主函数,在 f(x) == target 的约束下求 x 的最值 int solution(int[] nums, int target) { if (nums.l
阅读全文
摘要:labuladong解法 704. 二分查找(简单) 题目: 二分查找 思路: class Solution { public: int search(vector<int>& nums, int target) { int left=0,right=nums.size()-1; while(lef
阅读全文
摘要:labuladong讲解 76. 最小覆盖子串(困难) 题目: 思路: 在s中找出包含t所有字母的最小子串。 使用滑动窗口算法,在need哈希表中保存t所有字母的次数。 先扩展right,如果s[right]在need中存在,就增加window[c]次数,如果window[c]==need[c],则
阅读全文
摘要:167. 两数之和 II - 输入有序数组(中等) 思路: 有序数组求两数和等于target 使用双指针从两端夹逼的方法 class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { int left=
阅读全文
摘要:141. 环形链表(简单) 题目: 判定链表中是否含有环 思路: 用两个指针,一个跑得快,一个跑得慢。如果不含有环,跑得快的那个指针最终会遇到 null,说明链表不含环;如果含有环,快指针最终会超慢指针一圈,和慢指针相遇,说明链表含有环。 /** * Definition for singly-li
阅读全文
摘要:labuladong 48. 旋转图像(中等) 题目: 原地将二维矩阵顺时针旋转90度 思路: 先按左上至右下对角线对折,再将每一行调转 class Solution { public: void rotate(vector<vector<int>>& matrix) { int n=matrix.
阅读全文
摘要:讲解:labuladong 370. 区间加法(中等) 题目: 思路: 进行多次区间加减。使用差分数组,diff[n]记录num[n]-num[n-1]。这样对于区间[start,end]的加减操作只反映diff[start]+=inc,diff[end+1]-=inc。注意要判断end+1<n,如
阅读全文
摘要:labuladong讲解 303. 区域和检索 - 数组不可变(中等) 题目: 思路: 用前缀和记录开始到当前位置的元素和,这里前缀和数组长度n+1,presum[n+1]代表0-n的元素和 class NumArray { public: NumArray(vector<int>& nums) {
阅读全文
摘要:239. 滑动窗口最大值(困难) 题目: 给你输入一个数组 nums 和一个正整数 k,有一个大小为 k 的窗口在 nums 上从左至右滑动,请你输出每次窗口中 k 个元素的最大值。 思路: labuladong 使用单调队列。保障队列中头部最大,尾部最小。 在尾部放入元素时,将前方小于x的都从尾部
阅读全文
摘要:labuladong 496. 下一个更大元素I(简单) 题目: nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 * * 给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 n
阅读全文
摘要:355. 设计推特(中等) 题目: Twitter 和微博功能差不多,我们主要要实现这样几个 API: class Twitter { /** user 发表一条 tweet 动态 */ public void postTweet(int userId, int tweetId) {} /** 返回
阅读全文
摘要:295. 数据流的中位数(困难) 题目: 思路: labuladong 用一个大根堆装较小的数,用小根堆装较大的数,维持两个堆的大小接近。 那么取中位数时: large.size==small.size,(large.top+small.top)/2.0 注意2.0为了获取double large>
阅读全文