- 博客(29)
- 收藏
- 关注
原创 Day 不知道是几|贪心算法part1
贪心算法一般分为如下四步:将问题分解为若干个子问题 找出适合的贪心策略 求解每一个子问题的最优解 将局部最优解堆叠成全局最优解这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。不好意思了,贪心没有套路,说白了就是常识性推导加上举反例。好吧 开刷。
2024-09-13 17:46:59
949
原创 java八股!5(线程创建+并发容器+线程锁)
java.util.concurrent的包中提供了多种并发容器。并发容器降低了锁的粒度,只在容器部分加锁,其他没有操作的部分仍然可以被其他线程访问,提高并发度。通过CAS算法和部分代码使用synchronized关键字来实现。我们有两种常见的线程处理方法,一种是继承自Thread类,一种是实现runnable接口,Thread类本质上也是实现了一种runnable接口。但是用这两种方法创建的线程在运行结束后都会被销毁。如果线程数量多的话,频繁销毁和创造线程会影响性能而且浪费内存。
2024-09-12 13:33:19
474
原创 java八股!3
线程等待一段时间,当时间到达或者满足某种条件时,就会进入就绪状态,通过thread.sleep(), Object.wait(timeout)等方式可以进入超时等待状态。run方法是直接在当前进程的上下文中执行的,并不会创建新的进程,start方法是启动一个新线程,线程处于就绪状态,并分配好cpu资源的时候,会在新线程中执行run方法。:线程进入等待状态,可以通过调用object.wait(),Thread.join()等方式进入,等待其他线程唤醒。,线程正在运行中,开始执行run中的代码。
2024-09-10 18:04:09
332
原创 java八股!2
channel是NIO中的一个抽象概念,类似于传统的流,但更加灵活,channel可以是读,写或读写的,比较常用的channel有fileChannel,SocketChannel和ServerSockeChannel。NIO,非阻塞,IO时可以进行其他操作,线程通过不断轮询的方式查看io操作是否完成,或使用回调函数等机制。在高并发时比BIO性能好,但轮询会影响CPU效率。使用场景:字符流通常用于处理纯文本数据,字节流通常用于处理图像,视频,ppt,word类型数据,也可以用于处理纯文本。
2024-09-10 17:07:39
414
原创 java八股!1
一律从底层实现(数组,动态数组,双向链表,红黑树),线程安全(vector,hashtable,concurrenthashmap是线程安全的),迭代方式,元素类型(基本元素or对象,可否存null,是否重复,是键值对还是单一元素),先说明hash冲突的发生原因,hash表的实现是由数据经过hash函数运算得到的位置进行存储,但hash表的位置是有限的,计算的数据是无限的,总会出现不同组数据经过计算得到相同hash值的情况,就叫hash冲突。arraylist与linkedlist。
2024-09-10 15:08:43
526
原创 八股训练营|笔记1
有两种底层的锁的模式:互斥锁+自旋锁其他锁都可以根据折两个锁实现,互斥锁:上下文切换的状态(两次)自旋锁:一直占有cpu直到锁被释放。线程在尝试获取的时候会不断轮询直到使用场景不同被锁住的代码执行时间短,切换开销不划算,自旋锁合适。如果时间长,自旋锁一直占有cpu会造成资源浪费。读写锁:读不会更改资源,非互斥操作。写锁未被持有,其他线程可以并发持有读锁。使用场景(大量读少量写)悲观锁:认为多线程修改资源概率高,因此访问共享资源之前必须上锁。
2024-08-10 16:25:41
973
原创 Day 又不知是day几 | 回溯算法part3
需要回头找,所以不用设置index,反而用used数组来纵向(在递归过程中而非在本层中)表示哪些是被选择过的。这里的去重就不使用used数组,而是在每层用一个哈希表去重(也不需要传参,在本层不重复就可以)插入的元素要大于等于当前each数组最后一个元素,或者each为空可以直接插入,而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。同时需要在哈希表中没出现过的元素(本层新建哈希表,不需要传参)先sort后用used,在本层横向和递归纵向都去重的结合。开启回溯算法最后一part!
2024-07-28 15:03:27
285
原创 Day26 | 回溯算法PART2
普通回溯算法,巧思是有可能这一步啥也不选,因此在数组最后加一个0,如果index到最后一位了且当前为0,那么啥也不用push,直接回溯,也不用pop。跟上一题真的很类似但是不知道为什么第一版写的就是each存入不进result。substr()写的有问题,第一位参数是起始位置,第二位是字符串长度(不是结束位置)本来以为很容易可以AC。没想到题中的数组虽然不能一个数用多次,但有重复的数啊。计算一个vector的总和有没有简单的方法。每次都单独写一个函数出来。注意字符串反转函数,(algorithm中)
2024-07-28 13:28:13
335
原创 Day不知道是第几天 | 回溯算法PART1
感觉是回溯嵌套回溯?可以先得出一种三部曲:1.终止条件:字符串长度与输入字符串长度相等时终止2.入参:字符串长度n,当前字符串遍历的数字(需要根据数字能找到对应映射的三个字母)(可以根据stratIndex找到)(感觉需要xIndex和yIndex,分别控制横向和纵向的遍历,yIndex帮助找到当前数字对应的三个字母,xIndex帮助找到当前字母的遍历位置,数字字符串,(先这些吧),出参为void。
2024-07-27 19:55:32
1147
原创 Day24|二叉树 PART08
二叉树模块挺全面的,卡哥每题都给出了递归和迭代的解法,但我这次一刷基本上只选择了递归的方法(除了有些层序遍历会用迭代)而且二叉树这个模块我中间间隔了很久才重新开始刷。。中间经历了找实习+写毕设+回国实习。。实习从C++转到Java。。真的隔了很久。。前面一些二叉树的题(二叉树属性,修改与改造部分)急需二刷就先这样,一刷二叉树over!!
2024-07-27 15:15:46
1009
原创 DAY22|二叉树part6
递归思路:参数应该是输入数组,返回值是一个节点遍历找到数组最大值的下标,然后new一个根节点出来,左右子是递归送进去的该数组的左右下标。终止条件就是传入数组为0AC感觉可以两个都层序遍历,然后null也算节点.但这样无法根据队列是否为空来判断遍历是否结束。需要设置一个其他的标志位。这样试了一下发现不行,层序遍历无法按层来新构建一个二叉树或者在原始二叉树上直接覆盖。因为创建节点(除非是根节点)需要跟他的父节点相连,但层序遍历只在本层循环,无法得到上一层的信息。换递归。递归的话感觉需要前序遍历才能
2024-05-20 14:40:25
592
原创 随便刷刷1
动态规划从二叉树后面开始的题就掌握得像勾实一样了,当然之前的题也没好到哪去。于是决定开始从动态规划刷起,虽然代码随想录的训练营的二叉树部分我还没刷完。。换个part换换心情简单看了一下动态规划五部曲:1.确定DP数组以及下标的含义2.递推公式3.DP数组如何初始化4.遍历顺序5.打印数组其实不是太明白,因为我之前动态规划写的也不好,直接上第一题开练!
2024-05-17 23:14:51
813
1
原创 DAY21|二叉树PART5
感觉也不是不能做,可以存一下每层弹出的第一个元素(也就是最左边的元素),然后最后退出循环的时候这个空间里存的就是最底层最左边的元素,返回这个节点的值就可以了。因为(最差的情况的话)要遍历所有头节点到叶节点的路径找是否有相似的和,相当于每找到一条路径之和就比对一下。如果按左中右顺序递归,需要返回当前节点的深度,最后取一个深度最大最左面的节点作为结果。根据中序遍历的左子树的长度可以在后序遍历中从头开始得到左子树(后序遍历版)的长度。要不然就是先遍历求总的层数(深度),然后再次遍历到最后一层取最左边的元素。
2024-05-11 17:27:28
421
1
原创 DAY20|二叉树part4
思路:可以两棵树同时遍历,比较节点。可以递归可以迭代。* };if(p!return;if(p->val!迭代,对层序遍历比较熟练,写一下:/*** int val;* };pst.pop();qst.pop();* };*/
2024-05-10 16:52:09
920
原创 DAY19|二叉树part3
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。借用了测试用例2的图来说明,直接求min可能会有类似图上这种,某个节点的左子或者右子为空,但该节点还不是叶节点,那么此时程序会把这种节点的左右最小深度直接算作0.既然是完全二叉树,那么前n-1层的节点数一定是2^i个,只需要遍历最后一层的节点就可以了。(该节点是叶节点的情况可以包括在第二种条件中,因为这时候左右都为0,返回的max也是0,符合预期。
2024-05-09 22:13:21
1014
原创 DAY14|二叉树
终于开了二叉树!!从这开始我就学的不好了!!看我猛猛学!!先不刷题先从理论看起来首先二叉树的如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。二叉树的二叉树深度优先搜索:前中后都是这种遍历。一般用递归来实现,也可以用栈来模拟递归过程。其中,前序遍历:中左右中序遍历:左中右后序遍历:左右中广度优先搜索:一层一层遍历。层序遍历就是广度优先搜索。迭代法实现。使用队列。
2024-05-04 18:16:41
1094
原创 DAY8|字符串
写得巨慢因为最近考试实在是太多了抽不出时间做题。。。不过我尽量维持一天至少做一道题的速度,而且如果不是自己一下想出来最优解的题我都会先搞清楚思路,先写博客再做题。有时候一道题第一遍没写出最优解可能要到第二天才有时间debug或者重新写。。拖了好几天了。。。今天先把字符串Part1完结,part2还有更难理解的kmp。。。
2024-04-27 16:07:34
1171
2
原创 DAY7|哈希表Part2
left和right去重,则是在循环中找到等于0的情况,下一步需要向内同时收缩left和right(此时如果left<right,第一个指针i还是不变的)。注意第二个指针left是从i+1的位置开始的,如果是这种判断条件,相当于直接排除了所有第一个指针和第二个指针数相同的情况,这样会错过[-1,-1,2]的这种情况。第一个指针为i,放在一个for循环从头开始循环,第二个指针取名left,起始位置在i的下一个,第三个指针取名right,起始位置在最大的位置。隐约记得是没用哈希表的方法,其他的想不起来。
2024-04-25 00:21:01
1162
1
原创 Day6|哈希表
想了一下发现确实,第一次把数组里所有数一股脑存到哈希表里,然后再次遍历并且对照着找哈希表里有无满足target减当前数的元素,这种情况有可能直接找到自己,然后就返回两个相同位置的元素了。看题解去了,发现可以在第一次遍历的时候,就把数一边存入哈希表一边查询是否有满足条件的整数对,在存入表之前先查询表中有无满足条件的元素,这样很好地避免了找到自身。(题解给的另一种算法感觉也很好,排序+双指针,指针指向相同就取值,时间复杂度是O(mlogm+nlogn))暴力法太笨了,就不提了。但是也可以提供一些其他的思路?
2024-04-23 00:31:24
419
2
原创 Day4|链表
本来感觉当时写的没啥问题的,今天重新写的时候发现没用到虚拟头节点,也没单独考虑如果删除的节点是头节点怎么返回,也没有delete语句,直接重新连接了next指针就return了。遍历每个节点并入表,如果遍历的时候遇到表中已存在的点,说明存在环,且当前的节点就是入环节点。第二题说思路的时候答出了双指针,然后勉强写出来了,因为是在一个白板上写的,没运行,面试官直接看了眼说可以了就结束了。此外,之前一刷很多链表题的时候,我并没有什么设置虚拟头节点的意识,都是把头节点的情况单独拿出来写,以上,写过一次了还是错。
2024-04-22 19:57:05
345
原创 Day2|数组双指针、
一开始只能想到暴力解法,就是先算出所有平方再统一sort但是这样的时间复杂度有O(NlogN)(看了一下可以在原数组nums的基础上做修改,这样空间复杂度是O(1))看了点题解————双指针法原理就是绝对值最大的肯定在两端其中之一,所以能先找到最大的平方值。但是看了一下要求输出从小到大,先找到最大的放在哪啊(这里卡了一下,还是菜,没忍住又看了眼题解)可以在初始化的时候就给vector数组前size个空间置0(先开辟出这些空间,后面可以直接在这些空间上修改值)
2024-04-21 22:42:11
926
2
原创 DAY1打卡
最近ddl多的想鼠 markdown也是第一次用 今天太晚了先贴一下代码 明天来写点思路总结。AC了、、两道很简单的题。虽然好像还有别的题但是明天再加上吧、、ddl要紧。这里第一次写了个死循环出来,注意for的条件判断。还有i的原地踏步重新检查。
2024-04-17 23:23:06
314
1
原创 2020-05-27
int main(void){ Stack rowStack; int qRow, qCol, col, row, attacked, exitLoop; Board myBoard; cout << "Enter the position of the first queen\nRow: " << flush; cin >> qRow; cout << "Column: " << flush; cin >&g
2020-05-27 21:08:35
143
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅