![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试
小拖漫漫技术路
这个作者很懒,什么都没留下…
展开
-
Leetcode 236. 二叉树的最近公共祖先
该题有两种解法,深搜和广搜,深搜整体更优广搜更加好想,保留每次循环队列最后一个节点值class Solution {private: vector<int> result; int max_index = -1; void dfs(TreeNode* root,int startIndex) { if (root == nullptr) return; if (startIndex > max_index)原创 2022-04-16 00:03:25 · 480 阅读 · 0 评论 -
二叉树的迭代版 前中后序遍历(完整)
前序遍历 根左右 (将右节点压栈)1.往左遍历记录当前值,并将右节点压栈2.直到当前节点为空,取出栈顶右节点作为下一次循环起始/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} *原创 2022-04-15 15:42:26 · 792 阅读 · 0 评论 -
Leetcode148 排序链表(大白话说思路)——链表专题
思路:找中点,用递归不断分割,然后使用合并有序链表的方法合并左右链表/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, L原创 2022-03-18 11:03:32 · 1251 阅读 · 0 评论 -
Leetcode80 删除有序数组中的重复项 II(大白话说思路)——数组专题
思路:只需掌握一个套路,如何移动下标从当前位置找到第一个不等于当前位置值的下标???模板如下int temp = i;while(temp<nums.size()&&nums[temp]==nums[i])temp++;i =temp;删除删除有序数组中的重复项class Solution {public: int removeDuplicates(vector<int>& nums) { int cur = 0;原创 2022-03-17 10:58:16 · 466 阅读 · 0 评论 -
Leetcode140 环形链表(大白话说思路)——链表专题
思路:判断是否有环,快慢指针相遇即有环找环的入口,承接是否有环,相遇后将慢指针移到链表头,两个指针以相同每次移动一次的速度移动直到相等,返回当前节点即为答案为什么找环的入口,只要一个在相遇节点一个在链表头同时走,相遇即为环入口?slow指针在紫色节点时走过的路程等于a+bfast指针在紫色节点时走过的路程等于a+b+(b+c)*K2(a+b)=a+b+(b+c)∗K化简后为a=(K−1)∗b+K∗c2(a+b)=a+b+(b+c)*K化简后为a=(K-1)*b+K*c2(a+b)=a+b+(b原创 2022-03-14 17:22:51 · 1096 阅读 · 0 评论 -
Leetcode23 合并K个升序链表(大白话说思路)——链表专题
思路:写出mergetwo,不断合并(比较好想好写)mergetwo当 p q都不为空的时候,根据两者大小选择连哪一个,被选择的移到下一个,直到p q其中有一个为空,最后连上不为空的那一条class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { ListNode* head = NULL; for(auto&node:lists){原创 2022-03-11 16:15:19 · 240 阅读 · 0 评论 -
Leetcode42接雨水(大白话说思路)——数组专题
法一动态规划:left[i]记录下标0-i-1最大的值,right[i]记录下标i+1-n-1最大的值class Solution {public: int trap(vector<int>& nums) { int n = nums.size(); vector<int>left(n); vector<int>right(n); for(int i=1;i<n;原创 2022-02-17 00:47:54 · 427 阅读 · 0 评论 -
Leetcode230滑动窗口最大值(大白话说思路)——数组专题
思路1:维护优先队列prioprity_queue<int,int>pq记录数组值和下标,push以后不断地判断队头是否下标在滑动窗口范围内,若不是出队,否则即为当前最大值。思路2:维护双端队列deque<int>dq记录数据下标,维护一个单调递减的队列,每次判断队头下标是否在范围内,若不是pop_front,否则为当前最大值思路二代码class Solution {public: vector<int> maxSlidingWindow(vector&原创 2022-01-29 11:58:02 · 699 阅读 · 0 评论 -
Leetcode229求众数(大白话说思路)——数组专题
思路:摩尔投票法,类似与消消乐,拿最多次数的两个数和其他数做抵消,最后留下的肯定是次数多的数。摩尔投票法可以推广到「统计出现次数超过 n / k的所有数」。代码如下class Solution {public: vector<int> majorityElement(vector<int>& nums) { int num1=0,num2=0,cnt1=0,cnt2=0; for(auto&num:nums){原创 2022-01-14 11:59:34 · 152 阅读 · 0 评论 -
Leetcode219存在重复元素Ⅱ(大白话说思路)——数组专题
思路:用数据结构维护一个长度为k的集合,不断往集合里面填数,判断该数是否存在在集合中,当size大于k时抹掉最前端的元素从而维护长度小于等于k的集合。class Solution {public: unordered_set<int>set; bool containsNearbyDuplicate(vector<int>& nums, int k) { int n =nums.size(); for(int i=0;i&l原创 2022-01-11 11:31:47 · 194 阅读 · 0 评论 -
Leetcode209 长度最小的子数组(大白话说思路)——数组专题
思路:滑动窗口,当sum>=target的时候不断收缩左边界直到sum<target,再扩展右边界直到数组末尾直接上代码class Solution {public: int minSubArrayLen(int target, vector<int>& nums) { int n = nums.size(); int l = 0,r = 0; int sum = 0; int ans = INT_原创 2022-01-11 10:55:26 · 77 阅读 · 0 评论 -
Leetcode135分发糖果(大白话说思路)——数组专题
思路:计算每一个每一个元素左/右(包括自己)最长递减序列的长度。例如:1,2,2第一个数1 左最长递减序列:1 右最长递减序列:1 分到的糖果为max(左长度,右长度)=1第二个数2 左最长递减序列:2 、1 右最长递减序列:2、2 分到的糖果为max(左长度,右长度)=2第三个数2 左最长递减序列:2 右最长递减序列:2 分到的糖果为max(左长度,右长度)=1result = 1+2+1 =4问题:为什么第二个数右最长原创 2021-12-09 16:39:22 · 172 阅读 · 0 评论 -
Leetcode134加油站(大白话说思路)——数组专题
思路:模拟以下列数据为例gas = [1,2,3,4,5]cost = [3,4,5,1,2]从index 0开始行驶,我们到index1时汽油存量store += gas[0]-cost[0] = -2,那显然无法从index0到index1从index1开始行驶,我们到Index2时汽油存量store += gas[1]-cost[1]=-2,那显然无法从index1到index2从index…直到从index3开始行驶,我们到index4汽油存量 store += gas[4]-cos原创 2021-12-07 20:09:23 · 87 阅读 · 0 评论 -
柱状图中最大的矩形(大白话说思路)——数组专题
思路:分别找到元素两边第一个比该元素小的元素的坐标left[i]和right[i],以该元素为高的并包括该元素的最大矩形面积为(right[i]-left[i]-1)*nums[i],遍历所有元素重复以上操作更新最大面积。单调栈问题主要解决以下问题:比当前元素更大的下一个元素的坐标或者值比当前元素更大的前一个元素的坐标或者值比当前元素更小的下一个元素的坐标或者值比当前元素更小的前一个元素的坐标或者值例如[1,2,3]希望求得每个位置第一个比当前值大的元素的值,可以非常容易求得序列为[2,3,原创 2021-11-26 17:29:10 · 2131 阅读 · 0 评论 -
颜色分类/荷兰国旗问题(大白话说思路)——数组专题
思路:维护两个边界,左边界zero右边界two,使用one进行遍历,遇到0将与nums[++zero]交换,遇到1继续走,遇到2将其与nums[–two]交换。class Solution {public: void sortColors(vector<int>& nums) { int zero = -1,one=0,two = nums.size(); while(one<two){ if(nums[one]=原创 2021-11-11 16:51:23 · 801 阅读 · 0 评论 -
解数独和N皇后问题(大白话说思路)——数组专题
思路:哈希表+回溯解数独维护以下哈希表行关于值的哈希表rows[9][9]列关于值的哈希表columns[9][9]3*3表格关于值的哈希表squares[3][3][9]N皇后维护以下哈希表列的哈希表 unordered_set/columns横纵坐标和的哈希表 unordered_set/add横纵坐标差的哈希表 unordered_set/reduce解数独代码:class Solution {public: bool rows[9][9]; bool c原创 2021-11-04 16:11:36 · 76 阅读 · 0 评论 -
全排列1、2(大白话说思路)——数组专题
思路:回溯全排列1以求[1,2,3]全排列为例dfs(0)代表第一层,在第一个位置可以选1,2,3,dfs(1)代表第二层,在这个位置可以选1,2,3以此类推,使用回溯求解全排列2以求[1,1,0]全排列为例dfs(0)依然代表第一层,在第一个位置可以选1,1,0但是我不希望第一个位置去选第二个1,因为这样会导致选取的排列重复,因此需要判断若当前与前一位相同时,前一位被选了吗?如果没被选,则不能选 'if(st[i]||(i>=1&&nums[i-1]==nums[i]&a原创 2021-11-01 11:31:08 · 101 阅读 · 0 评论 -
跳跃游戏/跳跃游戏2(大白话说思路)——数组专题
思路:贪心,跳跃游戏1和跳跃游戏2最大的区别在于前者不保证能走到数组尾,而后者保证可以走到。因此跳跃游戏1需要走一步看一步(判断当前是否能走到),而跳跃游戏2最重要的是如何更新step。先看跳跃游戏1的代码class Solution {public: bool canJump(vector<int>& nums) { int edge = 0; for(int i=0;i<nums.size();i++){ //走一步原创 2021-10-27 10:31:40 · 102 阅读 · 0 评论 -
在排序数组中查找元素的第一个和最后一个位置(大白话说思路)——数组专题
思路:经典中的经典,二分问题,采用左开右闭的区间。当我们要找左边第一个等于target的元素我们应该去用mid更新r边界,而右边应该去用mid更新l边界。注意点1:当更新r区间是不包括r坐标(左闭右开),更新l区间是包括l坐标。注意点2:当没找到的时候,需要注意返回的坐标判断if的时候在[0,nums.size()-1]的范围内防止越界。class Solution {public: vector<int> searchRange(vector<int>& n原创 2021-10-12 19:28:49 · 138 阅读 · 0 评论 -
下一个排列(大白话说思路图示)——数组专题
下一个排列思路:从数组末尾开始找到一个比前一个大的数,该数下表为i,在从数组末尾重新遍历直到i找到第一个比i-1的大的数,将该数和i-1交换,并将数组(nums.begin()+i,nums.end())排序,即得到结果。如果数组一开始就是降序排列需要特判。例如下图1.找到第一个比前一个大的数是坐标3即途中i指向的4.2.数组末尾重新遍历找到第一个比nums[i-1]大的数nums[j]3.将nums[j]和nums[i-1]交换位置4.排序i-1后面的元素,sort(nums.begin原创 2021-09-26 11:09:35 · 69 阅读 · 0 评论 -
三数之和(大白话说思路)——数组专题
三数之和(大白话说思路)——数组专题再解说这题解法之前,先解决一个问题,如何当有序递增数组有重复元素时,如何找到第一个比当前元素大的数,代码如下。//当前数为 i int index = i;while(index<nums.size()&&nums[index]==nums[i])index++;i = index;思路:双指针,首先排序数组,遍历数组对于每一个元素nums[i]之后的数组做目标值为-nums[i]的两数之和。重要的是无论是双指针内部还是大循环中都需要在原创 2021-09-22 09:46:11 · 132 阅读 · 0 评论 -
盛最多水的容器——数组专题(大白话说思路)
盛最多水的容器——数组专题思路:双指针,p指针指向数组第一个数,q指针指向数组最后一个数,用一个变量记录最大雨水量计算当前雨水量,若比最大雨水量大,更新最大雨水量。如果nums[p]<nums[q],p往里移一位(p++),反之q往里移一位(q–)重复上一步操作,直至两指针相遇,返回最大雨水量重点:小伙伴一定有疑问,为什么nums[p]<nums[q],p往里移一位(p++),反之q往里移一位(q–)就可以覆盖到所有可能是最大雨水量的结果呢???反证法,假设数组的最大雨水量出自原创 2021-09-17 19:46:58 · 67 阅读 · 0 评论 -
寻找两个正序数组的中位数——数组专题(大白话说思路)
寻找两个正序数组的中位数——数组专题思路:二分,将问题分解为在两个数组中找第k大的数,根据这个函数分奇偶情况输出结果。如何求解第k大的数呢?因为两个数组都是有序,只要我们将两个数组中属于前k-1大的数都排除掉,就能求得第k大的数。例如nums1数组前x位数被排除,nums2数组前y位被排除(x+y=k-1),那么第k大的数就是min(nums1[x],nums2[y])。注意边界代码略(力扣官方题解第一种做法),思路比代码重要‼️...原创 2021-09-17 19:28:25 · 57 阅读 · 0 评论 -
HTTPS阮一峰博客总结
HTTPS为什么需要HTTPS??窃听风险:第三方获知通信内容篡改风险:第三方可以修改通信内容冒充风险:第三方可以冒充他人身份参与通信SSL/TLS协议作用所有信息加密传播校验机制,一旦篡改,通信双方会立刻发现配备身份证书,防止身份冒充运行过程非对称加密,客户端向服务端索要公钥,然后用公钥加密信息,服务器收到密文后,用私钥解密如何保证公钥不被篡改?公钥放在数字证书中,证书可信,公钥可信公钥加密计算量太大,如何减少耗用的时间?每一次对话,客户端和服务端都生成一个对话密钥,用原创 2021-09-14 14:56:11 · 996 阅读 · 0 评论