- 博客(46)
- 收藏
- 关注
原创 图论专题(一)
需要注意的是,之前做BFS/DFS的题基本都是check某个节点的周边四个节点,而这题严格意义上来说是check某个节点的四条边,也算提醒了一下自己不要固定思维。注意边的方向一定是a到其他节点。需要标记已经遍历过的格子。
2023-05-17 21:25:41
549
原创 堆专题
堆分大根堆/小根堆,通常是一个可以被看做一棵完全二叉树的数组对象。堆中某个结点的值总是不大于或不小于其父结点的值。小根堆小根堆的基本操作堆排序的应用比较多。其最好/最坏/平均时间复杂度都为O(nlogn);由于是就地排序,空间复杂度为O(1)。堆排序经典应用:TopK问题。
2023-05-16 22:19:50
460
原创 (多源广度优先搜索)leetcode-542. 01 矩阵
本题需要单独开一个seen数组来判断每个网格是否已经被处理过。(之所以在第一次访问时就要把网格的状态记录为已处理,后续所有访问到该网格的情况不再被考虑, 是因为本题求的其实是最短路问题,而bfs求的最短路一定是第一次访问到该点时的路径长度)做这题的时候新学了一下二维vector的初始化方式,记录一下。本题也是多源bfs,和leetcode-994. 腐烂的橘子。
2023-05-12 21:43:32
58
原创 (多源广度优先搜索)leetcode-994. 腐烂的橘子
而多源广度优先搜索相比于单源,无非就是最初初始化队列时,单源只需要加入一个源起点,而多源则需要把所有的多个起点都加入队列中,后面的步骤就差不多了。本题的代码有一个很巧妙的点:在判断一个点是否被访问过时,不需要单独开一个数组来记录访问状态,而是直接在原数组上修改值就可以。首先给出单源广度优先搜索的基本思路,参考。
2023-05-12 21:36:19
111
原创 leetcode-141. 环形链表
还可以考虑双指针:定义快慢指针,快指针一次走两个节点,慢指针走一个节点,如果有环的话快指针一定会追上慢指针,而环的长度就是两指针相遇时移动的次数。这题首先可以考虑暴力做法,每遍历一个节点就记下来,看能不能遍历到相同节点(hash真好用)。代码如下,算是一种空间换时间。
2023-05-07 11:13:36
47
原创 leetcode-160. 相交链表
双指针:一个指针pa指向A链表头节点,一个pb指向B链表头节点,两个指针依次向后遍历。如果pa/pb谁到链表终点,那就让它从B/A链表开始重新遍历,直到两个指针pa和pb相交。这样两个链表到最后一定会走过相同的路程(路程最长的情况就是:A和B没有共同节点,所以pa先走了一遍A再走B,pb先走一遍B再走A,最后在NULL处相交。首先hash:把一个链表中的所有节点存到哈希表中,再遍历另一个链表,查找每个节点是不是在hash表中出现过,时间复杂度为O(n),但要多开空间(属于是空间换时间)
2023-05-04 15:45:42
55
原创 (动态规划)leetcode-279. 完全平方数
即对于所有i*i<=n的i,在n-i*i的基础上再加一个完全平方数i*i就可以得到n,因此p[n]=p[n-i*i]+1,于是我们的目标就是找到最小的p[n-i*i]。很显然的动态规划的思路:假设和为n的完全平方数的最少数量为p[n],则对于每个n,都会有。),从1遍历到n-->O(n),对1-n中的每一个i向后遍历所有j*j-->O(p[n]=1+min(p[n-i*i]),其中i*i<=n。空间复杂度: O(n)时间复杂度: O(n。
2023-04-29 12:17:09
60
原创 (动态规划)leetcode-152. 乘积最大子数组
很显然,在num[i]<0的情况下,我们不应该考虑Max[i-1],而应该考虑Min[i-1],即我们希望乘一个绝对值最大的负数,这样负负得正,才能得到最合适的Max[i];本题显然也是动态规划的思路,假设Max[i]是以i为结尾的子数组的最大乘积,即Max[i]=max(nums[j]*```*nums[i]),其中0<=j<i<nums.size()。则显然,Max[i]与Max[i-1]有关。而若用Max[i]=max(nums[i],Max[i-1]*nums[i])来计算,就会出现。
2023-04-29 12:03:25
209
原创 (动态规划)leetcode-300. 最长递增子序列
即: 对于所有比i小的数j,如果有nums[i]>nums[j],则以nums[j]为结尾的递增子序列再加上i,还是一个递增子序列;在i的所有这样的递增子序列中,找到长度最大的那个,就是以nums[i]为结尾的最长递增子序列。本题很显然能用动态规划解。p[i]=max(p[j]+1),其中0<=j<i<n且nums[i]>nums[j]时间复杂度: O(n2)空间复杂度: O(n)
2023-04-29 11:36:07
107
原创 leetcode-128. 最长连续序列
这题有一个很简单粗暴的想法:把数组中的所有元素放入map的键中,值就存这个元素对应的下标(下标会不断更新,也是一个去重的过程);而map会对键做排序。因此把数组元素放到map的键当中后就完成了一个排序+去重的过程,然后再遍历所有的map键,找到其中最长的连续序列就行。好像还有其他做法,看看题解再回来更新)
2023-04-26 17:46:59
84
原创 leetcode-49. 字母异位词分组
思路就是把一个字符串"ABCDLJ```"看成是一个P进制的数(P一般取131),然后把每个子串的这个P进制转成十进制,计算出的就是hash值。注意这里的子串是以源字符串开头为开头的子串substr[0,n](比如"A","AB","ABC","ABCD","ABCDL","ABCDLJ",```)。顺序不同的字符串都归为一类,因此需要考虑新的hash计算方式,把字符的顺序省略掉。这里的p[r-l+1]是指p的r-l+1次方,因此可以提前预处理出p的所有次方值和substr[0,n]的hash值。
2023-04-26 17:42:51
50
原创 leetcode-1. 两数之和
具体的实现代码就非常简单了,就是遍历所有元素,如果当前元素可以在unordered_map中找到一个与其相加==target的值,就返回;否则就把这个元素加入unordered_map,用作对后续新添加的元素的匹配。唯一的难点在于hashtable中的键是元素值,值才是元素下标,有点绕(因为find函数是查找键是否存在的,存元素下标没有意义)hash可以自己实现,不过cpp的unordered_map可以代劳。2. 特点:无序(不会对存储的键值对进行排序),每个值对应一个键,不存在两个元素的键一样。
2023-04-25 23:20:16
49
原创 leetcode-8. 字符串转换整数 (atoi)
这题并不复杂,但是根据不同类型的输入会进行不同的操作,因此关键是有限状态自动机的应用。如果直接枚举出所有的情况,代码会非常复杂。此外这题还需要考虑溢出的边界情况。
2023-04-25 21:18:33
49
原创 简单使用Kaggle
这一步注意要打开右侧的Internet on开关,不然git clone会失败。kaggle中无法直接访问tensorboard,但可以用ngrok做转发。output目录会在一定时间内清空缓存,写入的文件无法永久保存。其中获取自己的authtoken需要注册ngrok。在kaggle中使用tensorboard。导入github上的项目。(折腾了好久qaq)
2023-02-03 23:45:43
225
原创 anaconda常用命令
创建环境 conda create-n xxx python=xx。删除环境 conda env remove -n xxx。删除包 conda uninstall xxx。查看已有环境 conda env list。安装包 conda install xxx。查看安装了哪些包 conda list。
2023-02-02 19:40:38
49
原创 leetcode-70.爬楼梯
用数组a(n)表示爬1-n级台阶的方法数。于每次只可以爬1/2个台阶,说明a[i]=a[i-1]+a[i-2]。既可以从第n-1级台阶爬1级/第n-2级台阶爬2级。改进:只存储a[i],a[i-1],a[i-2]时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(1)
2023-01-23 14:41:36
54
原创 leetcode-20.有效的括号
注意点:isMatch函数中注意a和b谁为左括号、谁为右括号(栈顶元素应该是左括号,因为有效的括号必须先出现左括号)法一:用栈辅助,判断括号是否闭合。
2023-01-21 22:54:52
34
原创 leetcode-1.两数之和
法二:哈希(unordered_map),键存储原数组中的元素,值存储该元素在原数组中的位置。遍历原数组,在hash表中查找是否有键满足key=target-nums[i],若有则返回。unordered_map中find的时间复杂度为O(1),大大缩短查找时间。法一:先排序,在排好序的数组中找到对应的两个元素,再在原数组中找这两个元素的位置并返回。缺点:要用多余的数组来存储,以用来排序。时间复杂度:O(nlog2n)空间复杂度:O(n+logn)时间复杂度:O(n)空间复杂度:O(n)
2023-01-21 21:33:20
54
原创 leetcode-388.比特位计数
不能写成a[i]=a[i>>1]+i&1;要注意运算符优先级的问题(最好把每个单独运算都用括号括起来)解法1:对于每个数,看最低有效位是否为1,然后右移一位这个数,直到判断结束。*注意for循环里要用k记录i,不能直接改变i,不然会进死循环。空间复杂度:O(1) 不计要返回的数组。时间复杂度:O(Nlog2N)时间复杂度:O(N)空间复杂度:O(1)
2023-01-14 22:03:31
32
原创 leetcode-剑指offer30.包含min函数的栈
https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/题目没啥特别的,但由于min、push、pop函数的时间复杂度都要求是O(1),所以求最小值不能用遍历的方法,必须在每次入栈的时候记录当前最小值。因此考虑用辅助栈,每次元素入栈,也同时把当前最小元素入辅助栈,保证辅助栈的栈顶一定是最小值就行。h...
2022-06-19 10:51:17
84
原创 leetcode-面试题17.11.单词距离
题目链接(简单得不像中等题)思路一:遍历数组,对第一个单词的每一个位置,寻找相隔最近的第二个单词,然后不断更新最短距离值。思路二:思路一在时间复杂度的考量上不够合理,因此想到设置两个int数组,分别记录第一个单词和第二个单词出现的每个位置,再求两数组元素之间相差的最小值。这种解法虽然只要遍历两次数组,时间复杂度从O(N^2)降到O(N),但由于两个int数组的存在,导致了O(N)的空间复杂度,所以显然也不够合理。思路三:双指针,分别记录两个单词的出现位置,然后计算距离并不断优化取最小值。i
2022-05-27 21:08:32
142
原创 JavaScript学习笔记-02
模块化模块是独立的文件,该文件内部的所有变量外部都无法获取。如果希望获取某个变量,则需要使用export和import。export用于导出//profile.js//1export var num=1;export var year=2022;//2var num=1;var year=2022;export{num,year};export *;//3export function multiply(x,y){ return x*y;};//4
2022-03-21 10:25:50
1003
原创 JavaScript-Promise
JavaScript中Promise对象用来传递异步操作的消息。生命周期Promise共有两种生命周期:1、pending(进行中)-此时代码执行尚未结束2、settled(已处理)-代码执行结束。settled又分为两种情况:(1)fulfilled(已完成)-异步代码执行成功(2)rejected(已拒绝)-异步代码执行失败创建未处理的Promisenew Promise( (resolve,reject)=>{});resolve、reject
2022-03-20 20:54:34
1195
原创 JavaScript学习笔记-01
数组常见方法1、arr.push(elem) 将一个或多个元素添加到数组末尾,并返回数组新长度2、arr.pop() 取出数组最后一个元素3、arr.shift() 取出数组第一个元素4、arr.unshift(elem) 将一个或多个元素添加到数组开头,并返回数组新长度Rest和Spread1、Rest将多个元素收集起来“凝聚”为单个数组function test(a,b,...rest){ console.log(rest);}test(1,2,3,4,
2022-03-20 16:07:07
1019
原创 leetcode-58.最后一个单词的长度
https://leetcode-cn.com/problems/length-of-last-word/先找到最后一个字母的下标(即最后一个单词的末尾),再找到这个单词开头的第一个字母的下标,即可得到单词长度。 一开始while语句条件的判定写成了s[i]==' '&&i>=0,在测试用例"joyful"的情况下老报错heap-buffer-overflow。后来突然想到&&的执行方向是从左到右,也就是先判断s[i]是否为空格,再...
2022-03-19 09:29:41
90
原创 leetcode-189.轮转数组
https://leetcode-cn.com/problems/rotate-array/解法一:首先取k=k%numsSize(因为移numsSize个位置和不移动是一样的结果)。注意到下标为i的元素向右轮转k个位置后,元素的新位置下标为(i+k)%numsSize,索性创建一个新数组,用来存储元素移动后的结果。最后把新数组拷贝回原数组。void rotate(int* nums, int numsSize, int k){ k%=numsSize; //0<=...
2022-03-18 19:38:08
295
原创 leetcode-66.加一
https://leetcode-cn.com/problems/plus-one/ 分三类情况讨论:1、数组最后一个数字不为9,即无需进位,直接把最后一个数+1后返回2、数组全部元素都为9,新创立一个数组a[digitsSize+1],把第一位置为1,其他置为0,返回3、数组倒数几个元素为9,找到最后一个不为9的元素的下标,对应元素值+1,其后所有元素置为0,返回int* plusOne(int* digits, int digitsSize, int* returnS...
2022-03-18 11:14:16
201
原创 leetcode-35.搜索插入位置
https://leetcode-cn.com/problems/search-insert-position/submissions/ 本题和704.二分查找类似,不同的是,在查找过后若target元素不存在,返回的不是-1,而是target元素应按序插入的位置。int searchInsert(int* nums, int numsSize, int target){ int low=0,high=numsSize-1,middle; while(low<=...
2022-03-18 08:32:31
60
原创 leetcode-704.二分查找
https://leetcode-cn.com/problems/binary-search/submissions/二分查找:时间复杂度:O(logn),其中 n 是数组的长度。空间复杂度:O(1)。int search(int* nums, int numsSize, int target){ int low=0,high=numsSize-1; int middle=(low+high)/2; while(low<=hi...
2022-03-18 08:05:34
63
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人