刷题日记
刷题
爱玩代码的勒勒
这个作者很懒,什么都没留下…
展开
-
一维前缀和 连续数组和为k
给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。滑动窗口没办法解决有负数的情况方法一:预处理 前缀和 sum_ij = preSum[j] - preSum[i-1];class Solution { public int subarraySum(int[] nums, int k) { //滑动窗口没办法解决有负数的情况 //预处理 前缀和 sum_ij = preSum[j] - preSum[i-1];\ .原创 2021-10-26 11:17:55 · 102 阅读 · 0 评论 -
三角形的最短路径和
这道题使用动态规划求解12 34 5 6dp[i][j]从三角形顶部走到i,j的最短路径和class Solution {public: int minimumTotal(vector<vector<int>>& triangle) { //i行j列 int m = triangle.size(); vector<vector<int>> dp(m,vector<原创 2021-10-26 11:14:03 · 158 阅读 · 0 评论 -
二分查找 不再硬背(一)
二分查找区间基本问题之前写二分查找都是硬背,没有体会到区间的概念,在刷题学习之后慢慢有了点感觉while循环时为什么可以写<也可以写<=号呢? 两者有啥区别呢?写left<right时可以发现 是取不到right的,表示整个区间是一个左闭右开的区间[left,right:int right = nums.size();//取不到size()因此我们在写区间时当 nums[mid]>target,则此时应该向左边查找,即right应该移到中间来,那么我们发现既然是取不原创 2021-10-12 11:02:33 · 98 阅读 · 0 评论 -
跳跃游戏 一
贪心思想解题每次找到最大能够跳的距离class Solution {public: bool canJump(vector<int>& nums) { int maxpos = 0; for(int i=0;i<=maxpos;++i) { maxpos = max(maxpos,nums[i]+i); //能跳的步数 if(maxpos>=nums.size原创 2021-10-09 21:03:59 · 72 阅读 · 0 评论 -
刷题日记-JZ25合并有序链表
合并有序链表 递归方式合并链表pHead1,pHead2base case是 pHead1为空或者pHead2为空递归方式是如果pHead1->val < pHead2->val 则pHead1结点作为新链表的头结点,即mergeNode = pHead1;同时pHead1->next继续向下递归,因为pHead1->next这个节点也有可能小于pHead2即mergeNode->next = Merge(pHead1->next, pHead2);否原创 2021-10-01 10:48:39 · 94 阅读 · 0 评论 -
二叉树遍历非递归写法
前序和中序比较简单使用一个if else即可判断 一直往左走就行了但是后序比较麻烦,因为最后访问根节点,涉及到一个走过的根节点重新访问如何知道我是第二次到达根节点访问,而不是节点左右子树还有没有访问过呢?实际上如果这个节点是第二次到达访问,即左子树肯定已经访问过出栈,不存在了只有可能右子树是没有访问过了,即我们用一个pre指针,指向已经访问过的上一个节点记录一下就行了,如果p->rightNULL 或 ->rightpre 说明这个点肯定需要访问,因为右子树被访问过了 或者根本没有右子原创 2021-09-28 17:27:12 · 101 阅读 · 0 评论 -
数据流中的中位数
数据流数据的数量不定,也就是数组的长度不定,可以向数组中插入数字,能够o(1)得到中位数我们知道使用堆或者快排思想可以得到无需数组中的中位数如何o(1)得到呢?使用有序数组,每次插入维持一个有序数组如果class MedianFinder {public: /** initialize your data structure here. */ //使用堆 vector<double> max; vector<double> min;原创 2021-09-28 16:07:17 · 125 阅读 · 0 评论 -
刷题日记-替换空格
思路:扩容将原来的字符串长度扩大到可以装下替换的之后的长度1个’ ’ 替换为’%20‘ 即一个空格本身有一个字节,还需2个字节,即m个空格,需要2m长度即newSize = originSize + 2m;从后往前 双指针p,q开始赋值当p>=0 并且 p<q时一直循环处理class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @原创 2021-09-28 16:01:56 · 91 阅读 · 0 评论 -
刷题日记-二维数组中查找某个目标值
时间复杂度 使用O(M+N)使用一种比较巧妙的搜索方法:从右上角开始搜索即x=0,y=n-1,arr[x][y]开始搜索若arr[x][y]== target 则返回true若arr[x][y]> target 若target小于当前值,只可能向左,即–y相反,则向下向更大的值搜索,++xclass Solution {public: bool Find(int target, vector<vector<int> > array) {原创 2021-09-27 22:11:14 · 111 阅读 · 0 评论 -
LeetCode 重排链表 OPPO笔试
重排链表 几个关键点:1. 双指针(快慢指针找中点)(用于反转后一部分)2. 反转后一部分 (reverse函数)3. 合并链表合并的时候在笔试的时候想了一种比我之前想的简单的方法从slow->next开始反转 而不是slow,如果从slow开始反转实际上会多插入最后一次 就会复杂一点同时保存slow作为最后一个结点,断开slow后面的节点 进行合并然后合并的时候注意 使用后面的链表p作为循环结束的条件,因为p为空说明所有的链表已经插入前面的链表了。...原创 2021-09-24 18:57:21 · 150 阅读 · 0 评论 -
剑指 Offer 19. 正则表达式匹配
使用动态规划解决正则表达式匹配问题class Solution {public: bool isMatch(string& s, string& p) { //递归 return helper(s,0,p,0); } bool helper(string &s,int i,string &p,int j) { //base case if(s[i]=='\0' &&a原创 2021-09-20 14:47:36 · 65 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串
方法:分为几个部分判断 DA[.B][E/eC] D其中D表示前后的空格,需要处理,跳过即可A可以带正负号 有符号数B无符号数C可以为有符号数(带+-号)小数点.后面必须是无符号数或者没有 如1.同时小数点.前面可以没有数字 所以用numeric = findUnsignedInt(s,pos) || numeric(或)E/e前后必须有数字 因此用numeric = numeric && findInt(s,pos)class Solution {..原创 2021-09-20 13:30:24 · 58 阅读 · 0 评论 -
topk算法
方法一 堆排序自建堆 heapMax方法,从上至下调整堆pop时,可以使用自上而下调整堆,调用heapMax(arr,0,sz-1);push时,需要自下到上调整即```cpp//从下到上调int son = sz-1;int dad = (son-1)/2;while(dad>=0){ if(arr[son]<=arr[dad]) return; else { swap(arr[son],arr[dad]); so原创 2021-09-20 10:48:57 · 128 阅读 · 0 评论 -
找第k个结点 剑指22
这道题很简单,利用双指针。 主要是以下几个注意点1. 判断链表是否为空2. 判断k是否为0,若为0无意义3.判断k是否超出了链表长度/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {publi原创 2021-09-19 09:14:00 · 61 阅读 · 0 评论 -
删除有序链表重复元素2
这道题目的方法1.遍历链表 找到当前结点与下一结点相等的节点,并将标记删除flag设置为true2.然后如果不需要删,则继续向后遍历,同时记录pre指针3.如果删除: 1. 记录cur的值,即删除节点的值val。设置一个删除节点pDel,然后while循环删除,如果待删除节点的值等于记录的val,一直循环 2. 循环体内需要记录pDel的下一节点nxt,每次删除pDel后更新nxt 3. 如果删除完之后pre为空 说明删除了头结点 因此hea...原创 2021-09-18 20:32:55 · 196 阅读 · 0 评论 -
LeetCode88 合并有序数组
1. 这道题为简单题目,但是还有需要好好思考的2. 首先不能使用额外数组合并,不然就没得后文了3. nums1后面有0填充,且填充数量正好是n,整个数组大小即m+n能够容纳合并后的数据4.既然要在原来的数组上操作,有没有可能能够避免移动数据(降低时间复杂度?),使用交换方式从后往前思考,类似于字符串空格替换(先开辟多余的空间)然后 使用多个指针 从后往前,避免移动数据因此我们使用p,q,s三个index分别指向num1的数据最后一个,num2数据的最后一个,num1整个大小的最后一个原创 2021-09-14 10:34:29 · 65 阅读 · 0 评论