力扣每日刷题
The_Dan
这个作者很懒,什么都没留下…
展开
-
LRU缓存及其代码实现
一、什么是LRU缓存算法LRU,Least Recently Used算法,即一种缓存淘汰策略。计算机的缓存容量有限,若缓存满了则需要删除一些内容,给新的缓存腾出空间,但问题是要删除哪些内容呢?当然是把用的少的缓存删掉,把最有用的数据继续保留以便于继续使用。那么如何判定哪些数据是有用的呢?缓存淘汰的策略有很多,而LRU则是一种较为简单常用的算法,LRU判定最近使用过的数据为有用的,很久都没用过的数据是无用的,在内存满了就优先删除很久未使用,也就是无用的数据。二、如何实现LRU缓存算法LRU 缓存机原创 2022-04-15 12:55:59 · 602 阅读 · 0 评论 -
1937. 扣分后的最大得分——动态规划
和接雨水很像,虽然两道题都尝试暴力之后超时了class Solution {public: long long maxPoints(vector<vector<int>>& points) { int m = points.size(); int n = points[0].size(); vector<long long> pre(n); //pre(n)是指上一层的状态 for (原创 2022-04-07 17:09:25 · 321 阅读 · 0 评论 -
667. 优美的排列 II——模拟
给你两个整数 n 和 k ,请你构造一个答案列表 answer ,该列表应当包含从 1 到 n 的 n 个不同正整数,并同时满足下述条件:假设该列表是 answer = [a1, a2, a3, … , an] ,那么列表 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中应该有且仅有 k 个不同整数。返回列表 answer 。如果存在多种答案,只需返回其中 任意一种 。class Solution {public: vector&l.原创 2022-04-01 00:13:07 · 328 阅读 · 0 评论 -
986. 区间列表的交集——双指针法归并区间
给定两个由一些 闭区间 组成的列表,firstList 和 secondList ,其中 firstList[i] = [starti, endi] 而 secondList[j] = [startj, endj] 。每个区间列表都是成对 不相交 的,并且 已经排序 。返回这 两个区间列表的交集。形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b 。两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3] 和 [.原创 2022-03-29 16:53:19 · 400 阅读 · 0 评论 -
牛客网模板速刷TOP101——个人笔记
反转链接创建表头,逐个反转链表内指定区间反转先移动到至于区域开头,逐个反转到区域结尾链表中的节点每k个一组翻转模拟法构建了reverse函数对于[begin,end]内的节点进行翻转,由于翻转过程后,前一个节点和后一个节点会对该段链表的链接丢失,所以要先记录前后节点,翻转后重新链接上。栈每k装入栈取出重新链接合并两个排序的链表迭代法一般创建单链表,都会设一个虚拟头结点,也叫哨兵,因为这样每一个结点都有一个前驱结点。两个链表头中小的插入哨兵后面,直到有一方全部插入结..原创 2022-03-22 15:25:51 · 1759 阅读 · 0 评论 -
134. 加油站——贪心
class Solution {public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { int n = gas.size(), sum = 0, Min = INT_MAX, index; for(int i = 0; i < n; ++i){ //sum是汽油-消耗, sum += (ga原创 2022-02-24 11:00:26 · 437 阅读 · 0 评论 -
315. 计算右侧小于当前元素的个数——归并排序
给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是nums[i] 右侧小于 nums[i] 的元素的数量。class Solution { vector<int> index; //记录序号 vector<int> temp; //临时的数组 vector<int> tempIndex; //临时数组对应的序号 vector<int> an.原创 2022-02-24 10:25:41 · 740 阅读 · 0 评论 -
278. 第一个错误的版本——二分查找
class Solution {public: int firstBadVersion(int n) { int left = 1, right = n, ans = n; while(left <= right){ //以后尽量还是写下面这个格式的,防止INT型溢出 int mid = left + (right - left) / 2; //如果false向左找,true向右找原创 2022-02-24 08:15:52 · 278 阅读 · 0 评论 -
240. 搜索二维矩阵 II——剑指Offer
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。 每列的元素从上到下升序排列。class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int rows = matrix.size(), cols = matrix[0].size(); .原创 2022-02-23 23:45:49 · 77 阅读 · 0 评论 -
357. 计算各个位数不同的数字个数——动态规划
给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n 。class Solution {public: int countNumbersWithUniqueDigits(int n) { vector<int> dp(n + 1); //特殊情况 n = 0时 if(n == 0) return 1; //特殊情况 n = 1时 if(.原创 2022-02-23 22:58:58 · 127 阅读 · 0 评论 -
343. 整数拆分——动态规划
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。 返回你可以获得的最大乘积 。class Solution {public: int integerBreak(int n) { if(n == 2) return 1; vector<int> dp(n + 1); for(int i = 2; i <= n; ++i){ .原创 2022-02-23 15:06:59 · 260 阅读 · 0 评论 -
338. 比特位计数——动态规划
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组ans 作为答案。class Solution {public: vector<int> countBits(int n) { //题目要求长度为 n + 1 的数组 ans vector<int> ans(n + 1); //设置初始值,已知0的二进制1的个数为0 .原创 2022-02-23 14:21:15 · 53 阅读 · 0 评论 -
322. 零钱兑换——动态规划
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。class Solution {public: vector<int> count; //记录各个金额所需耗费的最少硬币个数 int coinChange(vector<int>& coins, int amount).原创 2022-02-23 14:08:24 · 650 阅读 · 0 评论 -
70. 爬楼梯——动态规划
class Solution {public: int climbStairs(int n) { vector<int> dp(n + 1); if(n == 1) return 1; if(n == 2) return 2; dp[0] = 1; dp[1] = 2; for(auto i = 2; i < n; ++i)原创 2022-02-22 22:24:32 · 60 阅读 · 0 评论 -
53. 最大子数组和——动态规划
方法一class Solution {public: int maxSubArray(vector<int>& nums) { int n = nums.size(); vector<int> dp(n); dp[0] = nums[0]; int ans = nums[0]; for(int i = 1; i < n; ++i){ dp[i] = max原创 2022-02-22 22:13:41 · 73 阅读 · 0 评论 -
308. 区域和检索 - 数组可修改——从具体案例中讲解线段树的构造、更新
给你一个数组 nums ,请你完成两类查询。其中一类查询要求 更新 数组 nums 下标对应的值另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 ,其中 left <= right实现 NumArray 类:NumArray(int[] nums) 用整数数组 nums 初始化对象void update(int index, int val) 将 nums[index] 的值 更新 为 valint sumRange(int原创 2022-02-22 18:52:59 · 155 阅读 · 0 评论 -
304. 二维区域和检索 - 矩阵不可变——动态规划
一维前缀和class NumMatrix {public: vector<vector<int>> dp; NumMatrix(vector<vector<int>>& matrix) { //一开始思考,不是每次直接加起来就好了吗 //后来发现,这样消耗的时间也太多了吧,怪不得我AC不了 //看了题解才知道,看起来越简单的题,越要用精妙的方法去做 int rows =原创 2022-02-22 14:15:35 · 61 阅读 · 0 评论 -
309. 动态规划
给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。class Solution {public: int maxProfit(vector<int>& prices) { int n =.原创 2022-02-21 23:09:11 · 56 阅读 · 0 评论 -
300. 最长递增子序列——贪心 + 二分查找
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组[0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18] 输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例 2:输入:nums = [0,1,0,3,2,3] 输出:4示例 3:输入:nums = [7,7,7,7,7,7,7.原创 2022-02-21 21:14:22 · 455 阅读 · 0 评论 -
299.猜数字游戏
class Solution {public: string getHint(string secret, string guess) { vector<int> bulls(10), cows(10); int bull = 0, cow = 0; int n = secret.size(); for(int i = 0; i < n; ++i){ //一一比较 if原创 2022-02-21 10:44:33 · 1753 阅读 · 0 评论 -
289. 生命游戏——数组
class Solution {public: void gameOfLife(vector<vector<int>>& board) { int rows = board.size(), columns = board[0].size(); for(int row = 0; row < rows; ++row){ for(int column = 0; column < columns; ++co原创 2022-02-21 00:49:15 · 2337 阅读 · 0 评论 -
287. 寻找重复数——二分查找
class Solution {public: int findDuplicate(vector<int>& nums) { //示例1:[1, 3, 4, 2, 2] //范围是[1, 5] //在范围内使用二分算法 //(1 + 5) / 2 = 3,数组中小于等于2的有3个 //按照正常的不重复来说,小于3的应该只有1、2两个,那么说明重复的肯定小于3 //那么向左找,同理如果原创 2022-02-21 00:10:25 · 455 阅读 · 1 评论 -
279. 完全平方数——动态规划
class Solution {public: int numSquares(int n) { vector<int> dp(n + 1); //对每一个进行计算可以由多少个完全平方数组成 for(int i = 1; i <= n; ++i){ int minN = INT_MAX; //i 肯定可以由 (i - j * j) + j * j组成 //那么逐个原创 2022-02-20 22:52:51 · 138 阅读 · 0 评论 -
275. H 指数 II——二分查找
class Solution {public: int hIndex(vector<int>& citations) { int h = 0, n = citations.size(); int left = 0, right = n - 1; int ans = 0; //初值为0可以处理一些特殊情况 while(left <= right){ int mid = (left原创 2022-02-20 22:25:22 · 88 阅读 · 0 评论 -
274. H 指数
class Solution {public: int hIndex(vector<int>& citations) { sort(citations.begin(),citations.end()); int h = 0, n = citations.size() - 1; //如果序号大于0,并且第n个数大于h,那么后面的数肯定大于h while(n >= 0 && citations[n原创 2022-02-20 00:53:44 · 164 阅读 · 0 评论 -
264. 丑数 II——动态规划
class Solution {public: int nthUglyNumber(int n) { vector<int> dp(n + 1); int num1 = 1, num2 = 1, num3 = 1; dp[1] = 1; for(int i = 2; i <= n; ++i){ //不断地更新,从中取小 int temp1 = dp[num1] * 2,原创 2022-02-20 00:43:05 · 143 阅读 · 0 评论 -
260. 只出现一次的数字 III
class Solution {public: vector<int> singleNumber(vector<int>& nums) { //哈希表映射,最后把只出现一次的加入数组 unordered_map<int, int> freq; for (int num: nums) { ++freq[num]; } vector<int>原创 2022-02-20 00:19:01 · 128 阅读 · 0 评论 -
238. 除自身以外数组的乘积
class Solution {public: vector<int> productExceptSelf(vector<int>& nums) { int n = nums.size(); vector<int> answer(n); answer[0] = 1; //先计算出所有元素的左元素之积 for(int i = 1; i < n; i++){原创 2022-02-19 16:20:14 · 156 阅读 · 0 评论 -
229. 求众数 II
class Solution {public: vector<int> majorityElement(vector<int>& nums) { int n = nums.size(); int element1 = 0, element2 = 0; int vote1 = 0, vote2 = 0; vector<int> ans; for(int num : nums){原创 2022-02-19 16:05:56 · 135 阅读 · 0 评论 -
227. 基本计算器 II
class Solution {public: int calculate(string s) { vector<int> ans; int flag = 1; s = s + "+0"; int n = s.size(); char preSign = '+'; //上一个运算符 long long num = 0; for(int i = 0; i < n; i++原创 2022-02-19 14:54:15 · 125 阅读 · 0 评论 -
223. 矩形面积
class Solution {public: int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) { int area1 = abs(ax1 - ax2) * abs(ay1 - ay2), area2 = abs(bx1 - bx2) * abs(by1 - by2); //相当于都取绝对值小的那个 int width =原创 2022-02-18 15:46:03 · 1399 阅读 · 0 评论 -
222. 完全二叉树的节点个数——位运算
class Solution {public: int countNodes(TreeNode* root) { if(!root) return 0; TreeNode *node = root; int level = 0; //通过遍历左孩子可以得知二叉树层数 while(node -> left){ level++; node = n原创 2022-02-18 15:27:25 · 287 阅读 · 0 评论 -
221. 最大正方形——动态规划
class Solution {public: int maximalSquare(vector<vector<char>>& matrix) { if(matrix.size() == 0) return 0; int maxSide = 0; int rows = matrix.size(), columns = matrix[0].size(); vector<vec原创 2022-02-18 01:12:13 · 130 阅读 · 0 评论 -
220. 存在重复元素 III——滑动窗口+集合
class Solution {public: bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) { set<int> s; int n = nums.size(); for(int i = 0; i < n; ++i){ //INT_MIN,INT_MAX避免溢出INT //找出原创 2022-02-17 20:00:04 · 133 阅读 · 0 评论 -
216. 组合总和 III——搜索与回溯
class Solution {public: vector<vector<int>> ans; vector<int> combination; vector<vector<int>> combinationSum3(int k, int n) { for(int i = 1; i <= n / 2; ++i){ combination.push_back(i);原创 2022-02-17 18:54:58 · 127 阅读 · 0 评论 -
213. 打家劫舍 II——动态规划
是198题的进阶版,最后一间房屋和第一间房屋变成相邻的了。class Solution {public: int rob(vector<int>& nums) { int len = nums.size(); //房屋数量 //针对长度为一的处理 if(len == 1) return nums[0]; //针对长度为二的处理,取较大值 if(len == 2)原创 2022-02-16 15:56:58 · 405 阅读 · 0 评论 -
211. 添加与搜索单词——前缀数2.0、回溯
class WordDictionary {private: vector<WordDictionary*> treeNode; //26个子树 bool isEnd;public: WordDictionary() : treeNode(26), isEnd(false){} //添加单词 void addWord(string word) { //正常前缀树的添加流程 WordDictionary* node =原创 2022-02-16 15:19:49 · 212 阅读 · 0 评论 -
210. 课程表 II——深度遍历
class Solution {public: //是课程表207题的升级版,不同是结果需要输出顺序数组 //不同的地方作了标注,思路不懂的建议先翻看第207题的注释 vector<vector<int>> vecVecInt; vector<int> visited; bool flag = true; vector<int> ans; vector<int> findOrder(int原创 2022-02-16 00:24:09 · 80 阅读 · 0 评论 -
209. 长度最小的子数组——滑动窗口
方法一 暴力遍历class Solution {public: int minSubArrayLen(int target, vector<int>& nums) { int n = nums.size(), minLen = 100001; if(n == 0) return 0; for(int i = 0; i < n; i++){ int sum = 0;原创 2022-02-15 20:29:19 · 226 阅读 · 0 评论 -
208. 实现 Trie (前缀树)——附详细注释
class Trie {private: vector<Trie*> vecTree; //前缀数的子节点,一般有26个 bool isEnd; //如果该点是某个字符串的最后一个节点,则值为true,否则为false Trie* searchPrefix(string prefix){ //由于search和startsWith存在共同性,归纳成一个函数 Trie* node = this; for(char c : prefix)原创 2022-02-15 17:55:52 · 242 阅读 · 0 评论