栈和队列
🚑栈和队列🚑转自:🔥【github】
7.整数反转
9.回文数
20.有效的括号
232.用栈实现队列
225.用队列实现栈
155.最小栈
150.逆波兰表达式求值
394.字符串解码
133.克隆图
200.岛屿数量
84.柱状图中最大的矩形
542.01矩阵
622.设计循环队列
整数反转Leetcode给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转
解题思路
从低到高位依次加入队列,然后输出
注意反转后的溢出问题123456789int reverse(int x) { int rev=0; while(x!=0){ if(rev>INT_MAX/10 || rev<INT_MIN/10) return 0; rev=rev*10+x%10; x/=10; } return rev;}
回文数Leetcode判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
解题思路 ...
双指针
🐛双指针🐛转自:🔥【github】
19. 删除链表的倒数第N个节点
75.颜色分类
88.合并两个有序数组
167.两数之和II-输入有序数组
345.反转字符串中的元音字母
524.通过删除字母匹配到字典里最长单词
633.平方数之和
647.回文子串
680.验证回文字符串Ⅱ
5461.仅含1的子串数
删除链表的倒数第N个节点leetcode给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
解题思路
使用快慢指针,让快指针提前先走n+1步,然后双指针再同时让前走,当快指针指到结尾时,慢指针指向要删除结点得前驱
为了让整个链表得删除操作都统一起来,所以加入了头节点dummy,因为删除某个结点得操作需要它得前驱,而第一个结点没有前驱,所以加入头结点会更方便,删除操作与其他结点统一。
链表所谓删除结点,即前一个结点得next指针越过此结点,指向下一结点12345678910111213141516ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummy = ...
哈希表
⚗哈希表⚗转自:🔥【github】
1.两数之和
205.同构字符串
217.存在重复元素
242.有效的字母异位词
347.前K个高频元素
409.最长回文串
451.根据字符出现频率排序
594.最长和谐子序列
C++哈希表的基本使用
查找元素是否存在1234若有unordered_map<int, int> mp;查找x是否在map中方法1: 若存在 mp.find(x)!=mp.end();方法2: 若存在 mp.count(x)!=0;
遍历map12345 unordered_map<key,T>::iterator it; (*it).first; (*it).second for(unordered_map<key,T>::iterator iter=mp.begin();iter!=mp.end();iter++) cout<<"key value is"<<iter->first&l ...
字符串
转自:🔥【github】
⚡️字符串⚡️
242.有效的字母异位词
409.最长回文串
205.同构字符串
647.回文子串
9.回文数
696.计数二进制子串
滑动窗口思想(双指针进阶版)
76.最小覆盖子串
有效的字母异位词 Leetcode
示例:12输入: s = "anagram", t = "nagaram"输出: true
哈希表1234567891011121314151617181920 //构建哈希数组,用索引0~26代表a~z bool isAnagram(string s, string t) { if(s.length()!=t.length())return false; //普通数组必须提前分配空间,或者用动态数组 int hashArr[26]={0}; for(int i=0;i<s.length();++i){ hashArr[ ...
力扣周赛
力扣周赛
第200场周赛
5475.统计好三元组
5476.找出数组游戏的赢家
5477.排布二进制网格的最少交换次数
5475.统计好三元组leetcode给你一个整数数组 arr ,以及 a、b 、c 三个整数。请你统计其中好三元组的数量。如果三元组 (arr[i], arr[j], arr[k]) 满足下列全部条件,则认为它是一个 好三元组 。123450 <= i < j < k < arr.length|arr[i] - arr[j]| <= a|arr[j] - arr[k]| <= b|arr[i] - arr[k]| <= c其中 |x| 表示 x 的绝对值。返回 好三元组的数量 。
解题思路
暴力就完事了,在i < j < k统计满足条件的次数12345678910111213141516int countGoodTriplets(vector<int>& arr, int a, int b, int c) { int n = arr.size(); int cnt = ...
动态规划
🙈动态规划🙈转自:🔥【github】
==========
198.打家劫舍
213.打家劫舍II
337.打家劫舍III
矩阵 (10%)
120.三角形最小路径和
64.最小路径和
62.不同路径
63.不同路径II
序列(40%)
70.爬楼梯
55.跳跃游戏
45.跳跃游戏II
132.分割回文串II
300.最长上升子序列
139.单词拆分
322.零钱兑换
双序列(40%)
1143.最长公共子序列
72.编辑距离
5.最长回文子串
爬楼梯 Leetcode 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
解题思路
到达第n阶台阶有两种方式,一个是在第n-1个台阶处+1阶或在n-2个台阶处+2阶
建立一个dp数组,记录到达每一层时的所有方法总数
所以到达第n个台阶的方法与到底第n-1和n-2个台阶相关,dp[n]=dp[n-1]+dp[n-2]123456789int climbStairs(int n) { vector< ...
🎨剑指offer🎨
🎨剑指offer🎨
1.数组中重复的数字
2.二维数组中的查找
3.替换空格
4.从尾到头打印链表
5.重建二叉树
6.用两个栈实现队列
7.斐波那契数列
8.青蛙跳台阶问题
9.旋转数组的最小数字
10.矩阵中的路径
11.机器人的运动范围
12.剪绳子
13.剪绳子II
14.二进制中1的个数
15.数值的整数次方
16.打印从1到最大的n位数
17.删除链表的节点
18.调整数组顺序使奇数位于偶数前面
19.链表中倒数第k个节点
20.反转链表
21.合并两个排序的链表
22.树的子结构
23.二叉树的镜像
24.对称的二叉树
25.顺时针打印矩阵
26.包含min函数的栈
27.栈的压入、弹出序列
28.从上到下打印二叉树
29.从上到下打印二叉树II
30.从上到下打印二叉树III
31.二叉搜索树的后序遍历序列
32.二叉树中和为某一值的路径
33.复杂链表的复制
34.二叉搜索树与双向链表
35.序列化二叉树
36.字符串的排列
37.数组中出现次数超过一半的数字
38.最小的k个数
39.连续子数组的最大和
40.连续子数组的最大和
41.1~n整数中1出现的次数 ...
位运算
🍻位运算🍻转自:🔥【github】
136.只出现一次的数字
137.只出现一次的数字II
260.只出现一次的数字III
191.位1的个数
338.比特位计数
190.颠倒二进制位
只出现一次的数字leetcode给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
解题思路
一种方法是先排序,因为两个相同的数一定在一起,两个数一起遍历,当发现不同的时候便找到结果
当遍历到结尾时还没有发现则说明那一个数就出现在最后一位。123456789int singleNumber(vector<int>& nums) { sort(nums.begin(), nums.end()); for (int i = 0; i + 2 < nums.size(); i+=2) { if (nums[i] != nums[i + 1]) { return nums[i]; } } retu ...
二分法
🐧二分法🐧转自:🔥【github】
ps:二分法一定要牢记3个经常用的模板,注意边界检测。
34.在排序数组中查找元素的第一个和最后一个位置
69.x的平方根
153.寻找旋转排序数组中的最小值
167.两数之和II-输入有序数组
278.第一个错误的版本
744.寻找比目标字母大的最小字母
二分法的3个模板必须记住 3个模板代码区别很小,主要在于找到target之后指针的处理,建议比较target时的大于小于等于三种情况都写出来进行讨论,不易搞混淆,还要牢记左右指针的越界时的处理。while循环里时<=符号,while循环结束后right指针在前,left指针在后。
寻找一个数(基本的二分搜索)
寻找左侧边界的二分搜索(检查 left 越界的情况)
寻找右侧边界的二分搜索(检查 right越界的情况)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253int binary_search(int ...