📸排序📸
📸排序📸
堆排序、快速排序
215.数组中的第K个最大元素
建立哈希表并排序
347.前K个高频元素
451.按照字符出现次数对字符串排序
荷兰国旗问题
75.按颜色进行排序
数组中的第K个最大元素leetcode在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
使用SLT库排序1234int findKthLargest(vector<int>& nums, int k) { sort(nums.begin(), nums.end()); return nums[nums.size() - k];}
堆排序解题思路
堆排序会使用到优先队列priority_queue,可以当成一种高级队列,只不过这个队列是已经排好序的。
维护一个个数为k的小顶堆,堆从从上到下按从小到大排序
始终保持堆的大小为k,超出k就pop(),直到遍历结束位置,堆中存放着前k个最大元素,堆顶的元素就是正确答案。12345678int findKthLa ...
数组
数组
5460. 好数对的数目
好数对的数目leetcode给你一个整数数组 nums 。如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。返回好数对的数目。
示例123输入:nums = [1,2,3,1,1,3]输出:4解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始
解题思路
只要想到用一个二维数组的方式来判断就很简单,用到双层for循环暴力解决。12345678910int numIdenticalPairs(vector<int>& nums) { int cnt = 0; for (int i = 0; i < nums.size(); ++i) { for (int j = 0; j < i; ++j) { if (nums[i] == nums[j]) cnt ++; } ...
栈和队列
🚑栈和队列🚑转自:🔥【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< ...