Leetcode刷题
刷刷刷
Lance Jay
“搞怪的不是红绿灯,不是时机,而是我数不清的犹豫”
展开
-
笔试,计算贡献值,2022-9-2
计算时间区间的贡献值原创 2022-09-02 19:43:22 · 557 阅读 · 0 评论 -
大疆hexToBase64编码转换,笔试题,2022-8-21
大疆笔试原创 2022-08-21 16:30:15 · 297 阅读 · 0 评论 -
美团 2022-8-13笔试
2022年美团秋招笔试原创 2022-08-13 20:23:49 · 291 阅读 · 1 评论 -
牛客网,华为研发工程师编程题,3道
第一题:汽水瓶换汽水#include<bits/stdc++.h>using namespace std;int res=0;int main(){ int bottle=0; int drink=0; while(cin>>bottle){ if(bottle==0) break; drink=0; while(bottle>=3){原创 2022-04-02 18:41:16 · 602 阅读 · 0 评论 -
牛客网输入输出练习,stringstream
stringgetline(cin,str)getline(cin,str); 处理后还留有结束符在输入流中,故需要使用cin.get();接受最后一个结束符,才能接受后面得输入值。两个函数返回值都会丢弃换行符。getline(cin,str)的读取原理是将以‘\n’ 为结束符完整读取的一行,’\n’回车,所以当之前用cin读取一个字符串的时候输入函数getline(cin,str) 与cin.getline(str,int)的区别[C/C++]#include<bits/stdc++.h原创 2022-03-21 15:53:04 · 779 阅读 · 0 评论 -
C++ sort()用法
#include<iostream>#include<vector>#include <algorithm>using namespace std;bool cmp(string x,string y){ return x<y;}int main(){ int n; vector<string> res; string temp; cin>>n; while(n>0){.原创 2022-03-18 21:06:30 · 1024 阅读 · 0 评论 -
剑指68:二叉搜索树的最近公共祖先,k个子节点
方法一:逐个比较节点/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: TreeNode* res; b原创 2022-03-14 17:18:32 · 193 阅读 · 0 评论 -
剑指59:队列的最大值
方法一:利用大顶堆进行排序,再设置一个延迟删除大顶堆(保存删除值,直到下一次查询最大值再从大顶堆里弹出)class MaxQueue {public: priority_queue<int,vector<int>,less<int>> maxq,delq; //排序队列,延时删除队列 queue<int> q; //基本队列 MaxQueue() { } int max_value() {原创 2022-03-10 21:12:14 · 115 阅读 · 0 评论 -
剑指47:礼物的最大价值
方法一:基本的dfs,没有剪枝,会超时class Solution {public: int res; int row; int col; int maxValue(vector<vector<int>>& grid) { row=grid.size(); col=grid[0].size(); res=grid[0][0]; dfs(grid,0,0,0);原创 2022-03-07 11:33:45 · 596 阅读 · 0 评论 -
剑指45:把数组排成最小的数,重要
重点:字符串的排序,自定义排序方式,快排sort(strs.begin(),strs.end(),[](string& x,string& y){return x+y<y+x;});class Solution {public: string minNumber(vector<int>& nums) { //字符串,自定义排序规则 vector<string> strs; string res原创 2022-03-06 22:35:37 · 173 阅读 · 0 评论 -
剑指52:两个链表的第一个公共节点
方法一:朴素解法,双层循环,遍历比较两个链表节点是否相同(注意不是值相等)方法二:将两个链表分别入栈,均到达链表尾后,开始出栈,并比较是否相同,若相同则继续分别出栈,继续比较是否相同;若不相同,则上一次比较的节点是第一个公共节点(即当前比较的两个节点的next)方法三:先分别计算两个链表长度a和b(假设a>b),算出长度差a-b,长链表先走a-b步,然后两个链表开始比较若相同,则该节点是第一个公共节点,返回结果;若不相同,两个链表分别向后走一步,继续比较。方法四:利用集合set原创 2022-03-06 17:35:44 · 137 阅读 · 0 评论 -
剑指42:连续子数组的最大值,DP
DPclass Solution {public: int maxSubArray(vector<int>& nums) { //DP,无后效性 int res=nums[0]; int dp=nums[0]; for(int i=1;i<nums.size();i++){ dp=max(nums[i],dp+nums[i]); res=max(re原创 2022-03-06 00:22:59 · 42 阅读 · 0 评论 -
剑指40:最小k个数
class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { quicksort(arr,0,arr.size()-1); vector<int> res; res.assign(arr.begin(),arr.begin()+k);//assign实现不同容器赋值 return res;原创 2022-03-05 20:40:06 · 105 阅读 · 0 评论 -
剑指34:二叉树中和为某一值的路径
class Solution {public: vector<vector<int>> ans; vector<int> temp; vector<vector<int>> pathSum(TreeNode* root, int target) { if(root==nullptr) return {}; pathsearch(target,root);原创 2022-03-04 11:03:10 · 52 阅读 · 0 评论 -
剑指33:二叉搜索树的后序遍历
错误方法:class Solution {public: vector<int> temp; bool verifyPostorder(vector<int>& postorder) { return posthelper(postorder,0,postorder.size()-1); } bool posthelper(vector<int>& postorder,int l,i原创 2022-03-03 22:00:41 · 555 阅读 · 0 评论 -
for(int x:nums),在循环中改变nums元素的情况
首先结果:会改变循环赋值,即xclass Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> num={1,2,3,4,5}; for(int e:num){ if(e==3) num[3]=9; } return num;原创 2022-03-03 18:21:53 · 3018 阅读 · 0 评论 -
剑指29:顺时针打印矩阵
class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if(matrix.empty()) return {}; int row=matrix.size(); int col=matrix[0].size(); int i=0; int t=0,b=原创 2022-03-03 12:36:34 · 52 阅读 · 0 评论 -
剑指35:复杂链表的复制
一开始题目其实不是很好理解,本题的主要考点就是复制后的随机指针指向的节点可能还未生成,此时该如何去处理思路:方法一:先按cur->next把所有链表节点全部遍历并复制生成新节点,利用哈希表保存,然后再按对应key赋值random指针。/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val) { va原创 2022-02-28 11:40:09 · 197 阅读 · 0 评论 -
剑指25:合并两个排序的链表
方法一:双指针,比较两节点val大小,然后连接到ans链表后class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* ans=new ListNode(0); //这个新建一个节点,可以有效简化判断开头节点的步骤 ListNode* p=ans; //在输出结果时输出ans->next if(l1==nullptr)原创 2022-02-27 10:23:12 · 464 阅读 · 0 评论 -
剑指24:反转链表
反转链表的关键是要保存前后节点,先用right指针保存当前节点的下一节点,反转时当前节点指向左节点,然后为下一次反转做准备,left=cur,cur=rightclass Solution {public: ListNode* reverseList(ListNode* head) { ListNode* left=nullptr; ListNode* cur=head; ListNode* right; while(cur!原创 2022-02-25 21:33:08 · 362 阅读 · 0 评论 -
剑指21:调整数组顺序使奇数位于偶数前面
方法一:双指针,左指针从左往右搜索偶数,右指针从右往左搜索奇数,然后交换。class Solution {public: vector<int> exchange(vector<int>& nums) { int length=nums.size(); int left=0; int right=length-1; int temp; while(left<right){原创 2022-02-25 19:51:47 · 149 阅读 · 0 评论 -
剑指22:链表中倒数第k个节点
方法一先遍历整个链表,得到链表长度n,然后返回第n-k位即为倒数k位时间复杂度O(2n-k)=O(n)方法二双指针法,fast=slow+k-1,若fast指向链表末尾后一位即nullptr,则此时slow正好在链表倒数第k位,返回slow即为所求时间复杂度O(n)class Solution {public: ListNode* getKthFromEnd(ListNode* head, int k) { if(head==nullptr )原创 2022-02-25 17:17:26 · 315 阅读 · 0 评论 -
剑指18:删除链表的节点
简单题,主要就是一个链表操作删除链表节点可按位置分为以下几种情况:1,要删除的节点在链表头,那么直接返回head->next,即去掉表头,返回后一个节点2,要删除的节点在链表中间,那么就需要一个指针保存前一个节点,将前一个节点的next指向要删除节点的后一个节点,即pre->next=cur->next3,要删除的节点在链表末尾,情况基本等同于在链表中间4,链表中找不到要删除的节点,那么由于循环条件,链表指针会指向链表末尾后一位,cur指针会指向空,也不需要在链表中删除节点,但要原创 2022-02-25 10:28:29 · 2523 阅读 · 0 评论 -
剑指16:数值的整数次方,快速幂
class Solution {public: double myPow(double x, int n) { if(x==0) return 0.0; long p=n; //由于int范围为-2^31~2^31-1,最小值取反后超过int范围(否则直接负数幂不好求),所以用long double ans=1.0; if(n<0){ p=-p; //不能p=-n原创 2022-02-25 10:12:46 · 54 阅读 · 0 评论 -
leetcode 717:1比特与2比特字符
class Solution {public: bool isOneBitCharacter(vector<int>& bits) { int length=bits.size(); int n=0; int flag=0; while(n<length-1){ if(bits[n]==0){ flag=0; }原创 2022-02-20 22:05:04 · 115 阅读 · 0 评论 -
剑指15:二进制中1的个数
方法一:将1左移i次,与n按位与,如果结果不为0,说明该位是1,遍历32位class Solution {public: int hammingWeight(uint32_t n) { int res=0; for(int i=0;i<32;i++){ if(n&(1<<i)) res++; } return res; }};方法二:n与原创 2022-02-20 20:15:31 · 88 阅读 · 0 评论 -
剑指12:矩阵中的路径
思路:1,为了避免重复结果同一个元素,可以匹配正确该元素后把该位置赋空字符\0,但是要在其他路径搜索前恢复该字符。2,匹配正确一个元素后,最多有四个方向可能有解,但是要考虑矩阵边界。3,由于不需要返回具体路线,所以可以根据设置标志位来判断剪枝操作。看了思路以后写出,要复习巧妙的一点是利用回溯法,同时搜索和返回了res,需要注意的是在下一个路径开始前要还原字符。class Solution {public: int col,row; bool exist(vector<v原创 2022-02-17 21:47:25 · 158 阅读 · 0 评论 -
剑指10:旋转数组最小值
思路:1,把数组看为两部分,A部分一定大于等于B部分,因此要判断最小值范围应该拿最右边值来作为对照。2,二分法取中间值来判断,(1)如果mid>right,说明mid此时在A部分,不可能是最小值,最小值范围可以缩小到[mid+1,right];(2)如果mid<rihgt,说明mid此时在B部分,且不会在最右端,此时mid是已经发现的最小值(可能为答案),可以把right缩小到mid位置,最小值范围为[left,mid](3)当mid=right,有多种情况,一种是mid在A部分,ri原创 2022-02-17 00:21:07 · 299 阅读 · 0 评论 -
剑指09:两个栈实现队列
思路:1,栈是先进后出,队列是先进先出,如果要实现先进先出的功能,必然是要把一个栈全部倒到另一个栈,把前一个栈底元素(最先的元素)改变为后一个栈的栈顶元素,然后执行出栈pop()操作。2,两个栈,分别负责入队列,出队列,但有个问题,如果多个数先入队列再出队列混合操作时,如果来回在两个栈中所有元素出栈入栈十分麻烦,考虑到队列的后进后出特点,因此入队列可以不用过于考虑,只要当出队列栈空了时,再把入队列栈的元素全部移过来,再执行出队列就可以,这能有效减少时间复杂度。3,情况分析:(1)当入队栈为空,出队栈原创 2022-02-16 16:29:50 · 63 阅读 · 0 评论 -
剑指offer 07:重建二叉树
思路:1,首先这题是针对二叉树元素不重复的情况进行解决,那么就比较容易找到中序遍历中的根节点位置2,提供二叉树的前序和中序遍历,就能够确定根结点,以及左右子树长度3,首先,根节点就是前序遍历的第一个元素,然后再中序中搜索该元素,确定中序遍历中根结点位置;确定中序遍历中根节点位置后,依据根节点序号-该子树最左端序号就能得到左子树长度(右子树就是该子树最右端序号-根结点序号)4,题目要求构建树,因此要采用递归的方法将大的二叉树不断分解成小的二叉树,然后从小到大构建(从叶子结点开始)5,解答时要注意一原创 2022-02-13 16:37:36 · 436 阅读 · 0 评论 -
Leetcode15:三数之和
问题难点:1.a+b+c=0可以转化为 b+c= - a,然后遍历数组赋给a2.不重复的三元数组,因此有必要先排序,将重复数字放在一起好去重。3.剪枝:(1)排序后的数组,从小到大赋值a,如果遇到a>0,那么必然不存在a+b+c=0,可以直接终止。(2)当遇到下一个赋给a的元素和上一次a相同,那么下一次的三元组肯定是上一次的子集,所以可以直接continue。同理,对于相同的b,c可以直接跳过。(3)当相同的a搜索到符合要求三元组时,还可能有其他答案,就可以收缩范围再搜索。(4)当num原创 2022-02-09 12:00:30 · 46 阅读 · 0 评论 -
剑指offer 06 从尾到头打印链表
思路:方法1:利用栈的先进后出特性,从头遍历链表,开始入栈到末尾后,开始出栈并放入vector中class Solution {public: vector<int> reversePrint(ListNode* head) { stack<int> temp; while(head!=NULL){ temp.push(head->val); head=head->next原创 2022-02-02 23:03:10 · 1006 阅读 · 0 评论 -
剑指offer 05:替换空格
思路:方法1:新建一个容器ans,遍历字符串s,遇到空格时往新容器ans里添加“%20”遇到非空格时往里加相同的字符class Solution {public: string replaceSpace(string s) { string ans; for(int i=0;i<s.size();i++){ if(s[i]==' ') ans=ans+"%20"; els原创 2022-02-02 19:51:33 · 328 阅读 · 0 评论 -
剑指04:二维数组中的查找,方法:二叉树(坐标轴)
方法1:坐标轴法,和二叉树搜索差不多时间复杂度O(n+m),空间复杂度O(1)将初始temp设为左下角点,row=n-1,col=0temp=matrix[i][j],如果temp>target,那么temp位置要向上移,row–如果temp<target,那么temp位置要向右移,col++否则就剩下temp==target,返回true循环退出的条件就是边界条件 row>=0 && col<m需要注意的是 如果matrix为空,在对m赋值时,由于访原创 2022-01-27 11:32:27 · 1000 阅读 · 0 评论 -
剑指offer03:数组中重复数字
除了暴力解法外,对于搜索重复数字的题目,肯定要先想到哈希表快速搜索,本题需要注意的是不需要再对应成太多数值,只需要把是否重复对应成true,false就可以了方法1:哈希表 时间O(n),空间O(n)class Solution {public: int findRepeatNumber(vector<int>& nums) { unordered_map<int,bool> map; for(int num:nums){原创 2022-01-26 18:39:04 · 723 阅读 · 0 评论 -
Leetcode 53:最大子数组和
方法一: 超时双循环遍历,外循环搜索起始点,内循环搜索最大子数组class Solution {public: int maxSubArray(vector<int>& nums) { if(nums.size()==0) return 0; int max=nums[0]; for (int i=0;i<nums.size();i++){原创 2022-01-24 15:47:32 · 485 阅读 · 0 评论 -
Leetcode 35:搜索插入位置
思路:时间复杂度要求O(log n),想到二分搜索,这题有一点区别就是返回索引有一点变化。程序写法可以分为首尾索引用while逼近缩小,也可以使用函数递归调用返回写。需要考虑的几个点,left变化,mid计算=left+(right-left)/2 ,小于left,大于right返回的索引,普通解法1,函数迭代class Solution {public: int searchInsert(vector<int>& nums, int target) {原创 2022-01-14 21:59:47 · 3190 阅读 · 0 评论 -
Leetcode 28:实现strStr()
思路:方法一:先匹配haystack和needle的第一个字母,匹配成功则再逐个匹配needle的所有字母,若全部匹配成功则返回index(这里是首字母匹配成功,index=i,如果needle中有任何字母不匹配则index=-1,子循环结束后判断index是否为-1,不为-1则说明上面子循环所有字母匹配,找到答案,返回index)class Solution {public: int strStr(string haystack, string needle) { if原创 2022-01-04 11:27:00 · 223 阅读 · 0 评论 -
Leetcode 27:移除元素
方法一:双指针,快指针遍历数组搜索保留值,慢指针指向下一个值的保存位置,最后返回慢指针索引即为最后数组长度。class Solution {public: int removeElement(vector<int>& nums, int val) { int fast=0; int slow=0; //双指针,慢指针指向被替换的位置 while(fast<nums.size()){ if(nums原创 2022-01-04 11:02:19 · 3017 阅读 · 0 评论 -
Leetcode 26:删除有序数组中的重复元素
思路:1.数组已经排好序,不允许使用额外空间,只能O(1)空间复杂度2.数组删除不能单个操作,需要移动该元素后面所有元素。3.使用双指针,慢指针指向不重复的元素的后一位,快指针遍历整个数组搜索新的元素。4.当快指针到达数组末尾时,慢指针指向的索引位置即新的不重复数组的长度。class Solution {public: int removeDuplicates(vector<int>& nums) { if (nums.size()==0)原创 2022-01-03 15:49:28 · 627 阅读 · 0 评论