字符串
转自:🔥【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 ...
每日一题☀️
题目
最接近原点的的K个点
最接近原点的的K个点
973. 最接近原点的 K 个点我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。
(这里,平面上两点之间的距离是欧几里德距离。)
你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。
示例 1:1234567输入:points = [[1,3],[-2,2]], K = 1输出:[[-2,2]]解释: (1, 3) 和原点之间的距离为 sqrt(10),(-2, 2) 和原点之间的距离为 sqrt(8),由于 sqrt(8) < sqrt(10),(-2, 2) 离原点更近。我们只需要距离原点最近的 K = 1 个点,所以答案就是 [[-2,2]]。示例 2:123输入:points = [[3,3],[5,-1],[-2,4]], K = 2输出:[[3,3],[-2,4]](答案 [[-2,4],[3,3]] 也会被接受。)
代码123456789class Solution {public: vector<vector<int& ...
树🌳
刷题目录求根到叶子节点数字之和
检查平衡性
求根到叶子节点数字之和129. 求根到叶子节点数字之和给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:123456789输入: [1,2,3] 1 / \ 2 3输出: 25解释:从根到叶子节点路径 1->2 代表数字 12.从根到叶子节点路径 1->3 代表数字 13.因此,数字总和 = 12 + 13 = 25.示例 2:123456789101112输入: [4,9,0,5,1] 4 / \ 9 0 / \5 1输出: 1026解释:从根到叶子节点路径 4->9->5 代表数字 495.从根到叶子节点路径 4->9->1 代表数字 491.从根到叶子节点路径 4->0 代表数字 40.因此,数字总和 = 495 + 491 + 40 = 1026. ...
贪心算法(自刷)
贪心算法(自刷)53.最大子序和
53最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
思路:
初始化
定义一个当前和curSum,为负数的时候就清零从新累计,初始值为0;
定义一个最大和maxSum,每当curSum求出之后都要拿来比较一下,进行更新,初始值为Integer.MIN_VALUE,保证计算第一
元素的时候maxSum就更新为curSum;
遍历,对每一个元素进行如下操作:
计算当前和curSum;
更新最大和maxSum;
更新当前和curSum,若为负数则清零
返回
代码:1234567891011121314151617181920212223class Solution{public: int maxSubArray(vector<int> &nums) { //类似寻找最大最小值的题目,初始 ...
栈(自刷)
栈题目一
剑指 Offer 09. 用两个栈实现队列
用两个栈实现队列剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:1234输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:1234输入:["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"][[],[],[5],[2],[],[]]输出:[null,-1,null,null,5,2]提示 ...