每日一题 & js练习
438. 找到字符串中所有字母异位词
1 | var findAnagrams = function(s, p) { |
Hydra blog
每日一题 & js练习
1 | var findAnagrams = function(s, p) { |
还卡我内存,一时代码还没过
学到了两个前缀和的运用技巧
关于初始化数组:可以将所有坐标+1,这样就回避了边界问题
前缀和问题可以节省一个数组,内存开销变小
边长r = x2 - x1 + 1, 如果题目给的是坐标, 那就是 x1 - 1 = x2 - r, 因为坐标x1是包括进矩形的,所以从x1 - 1开始,但这样也带来了一个问题, x1不能为0, 所以数组要从1开始计数
1 | #include<iostream> |
这题的方法太妙了,首先前缀和就不说了,直接上公式, s[R] - s[L - 1] % k == 0 ==> s[R] % k == s[L - 1] % k ,所以只要有两个数s[R] 和 s[L - 1]的前缀和mod k的余数相同,那么就必然是一个K倍区间,所以每次出现一个之前出现过的mod k的余数的数,就要res += cnt[之前出现过的余数], 而且还要出现次数加一
最后是一个边界问题,因为上面的都是两个端点所组成的区间(不包括左端点,所以是2~n的所有序列和子序列被包括了),有一种情况被排除了==>[0, n],所以一开始就要包括cnt[0]=1, 这个区间的第一个值为零,所以是一个万能区间(因为值为0,对余数无影响),只要有[1, n]的数符合情况,那它也就非零了
1 | #include<iostream> |
简单地二分
1 | #include<iostream> |
把二分复习了一遍
1 | #include<iostream> |
二分题,不过要考虑许多边界问题
1 | #include<iostream> |
前缀和模板题
先上一个tle的解法, O(n^2)超时
1 | #include<iostream> |
找了个能过的代码改了一下, 二分法确实牛b
1 | #include<iostream> |
对区间数进行二分查找,时间复杂度为O(nlog(n))
1 | #include<iostream> |
难题不会写,只能写简单题过日子这样子
空间还能优化一下,不想改了
1 | class Solution { |
星期六果然还是懒了, 今天就更新计网算了, 顺便打一下蓝桥杯的题目, LeetCode就一题吧
万众期待的计算机网络它来了,接下来我决定每天都更新一点计算机网络的学习笔记,这种方式能够加强自身的的学习印象(其实我写博客是为了面试加分)
看了个培训班的社招面试准备,给我整自闭了,项目多得跟喝汤一样,我真的有点怀疑人生了
我们可以从两个角度来回答这个问题:一种是描述组成它的软硬件;另一种是将其视为为分布式应用提供基础服务的联网设施来描述。其实,第一种角度,是从它的组成来描述,第二种角度是从它的功能来描述
因特网是一个世界范围的计算机网络,这意味着它互联了数以亿计的计算设备(不仅仅是计算机哦);这些设备包括但不限于传统PC、工作站以及所谓的服务器。现在有更多的设备加入到因特网中,比如便携式计算机、电视机、汽车、传感器等。用因特网的术语来说,所有连入因特网的设备都叫做主机或者端系统
端系统通过通信链路和分组交换机连接到一起。
分组交换机从它的一条入链路接收分组,并且选择一条出链路将分组转发出去;分组交换机也有很多种类,最为有名的是路由器和链路层交换机;两者的的不同之处在于,链路层交换机主要用在接入网中,路由器主要用在网络核心.
端系统通过因特网服务提供商(Internet Service Provider,简称ISP)接入因特网
很有名的协议有:**TCP(Transport Control Protocol,传输控制协议)和IP(Internet Protocol,网际协议)**;
应用程序编程接口(API,Application Programming Interface)
协议:定义了两个或多个通信实体(不一定是端系统,还有可能是分组交换机等)之间交换信息的格式和次序以及对该信息所采取的动作
端系统:与因特网相连的计算机和其它设备,往往处于网络的边缘
端系统分类:客户和服务器
接入网:是指将端系统连入到边缘路由器的物理链路
边缘路由器:是指端系统到任何其他远程端系统路径上的第一台路由器
传输媒体是构成通信链路的主要部分,物理媒体通常可以分为导引性媒体和非导引性媒体;其中导引性媒体,信号沿着固体前行;而非导引性媒体中,信号沿着固体媒体前行
值得注意的是,架设传输媒体的人历成本要远远高于物理材料的成本
网络核心即为由互联端系统的分组交换机和链路构成的网状网络
通过网络链路和交换机移动数据有两种基本方法:电路交换和分组交换
分组在通信链路上以等于该链路的最大传输速率传输通过通信链路。因此如果某条链路的最大传输速率为R,分组长度为L,则该链路传输该分组的时间为L/R;这个时间也被称为传播时延
在电路交换网络中,在端系统通信会话期间,交换机会预留端系统间通信路径上的相关资源(缓存,链路传输速率),即先建立连接,然后通信;而在分组交换网络中,这些资源没有被预留;也就是说,在端系统进行通信时,其所需要的资源是被保持的,其他通信是无法使用这一部分资源的;也就说,端系统间真正建立了一条“连接”;而这一连接,用电话的术语被称为“电路”。传统的电话网络就是电路交换网络的例子。
我好蠢,我好蠢,我好蠢,我好蠢,我好蠢,我好蠢,我好蠢,我好蠢,我好蠢…………
别人的更新方式各种ac,我的各种卡死
写了好久,最后还是看题解了
1 | class Solution { |
这个作者的代码,严格遵循了左闭右开的习惯,在第二层循环中遍历完区间,然后更新左右端点
ver2.0
这个代码的优化版本 tql
1 | class Solution { |
写了这么多题目,感觉还是啥也不会,想到了第一层,没想到第二层,想到了排序没想到取绝对值,想到了第一层没想到第二层,题目还是做少了,我是sb
1 | class Solution { |
1 | class Solution { |
总结:如果x到不了y+1(但能到y),那么从x到y的任一点出发都不可能到达y+1。因为从其中任一点出发的话,相当于从0开始加油,而如果从x出发到该点则不一定是从0开始加油,可能还有剩余的油。既然不从0开始都到不了y+1,那么从0开始就更不可能到达y+1了…
贪心题还是挺麻烦的,至少我知道方法,但是没写出来(用Carl的话说就是:知道题目方法是常识性的东西,但是代码实现困难)
贪心主要方法:手动模拟方法,感觉可行,就试一试
难点1:如何设置寻找差值
有n个数,但是差值只有n-1个,怎么找呢。解决办法是在首部设置一个跟nums[0]相等的虚拟的数,然后就可以从第1个数开始算差值进行比较
1 | class Solution { |
难点2:为什么是prediff <= 0? 这个问题我认为应该分开来思考成两种情况,< 0就不说了,一正一负很好理解。
问题是为什么等于零?为什么cur 不等于0,pre可以等于0?题目不是要求一正一负吗?这个问题应该这样思考,pre为0,cur不为零,那么证明此时cur这个点是峰值(低谷)的。反过来,如果cur==0, pre != 0,那就是说当前元素cur跟前一个元素重复了,所以就不对了,这个解法中的pre只会在开始为0,后面pre的取值由cur更新,而cur == 0是不满足if条件的。换句话说,如果数组中有重复元素,它只会取第一个,这也是这个算法的巧妙性
还有一个y总的代码也挺好的,下次更新吧
贪心解法
每次求值都进行选择,是当前的值【num[i]】更好还是【sum+num[i]】更好,局部最优形成全局最优
1 | class Solution { |
动态规划
核心公式差不多
1 | class Solution { |
这题有一个误区,就是我能不能在同一天卖,然后再买。题目没说,那就应该是可以的。所以贪心的思路也就出来了,检查每两天的股票差值,是正值就买入,是负值就跳过,从局部最优到全局最优
1 | class Solution { |
贪心题就是难想出来,代码其实挺简单的,这种题最重要的锻炼贪心思维
具体来说就是判断最大覆盖范围,如果在覆盖范围内就更新maxStep,最后结果就出来了
1 | class Solution { |
今天终于提起刷题的欲望了,但都是简单题?麻了,学计网去,等书到了开始更新计网的笔记,这种纯理论的东西就是记着玩,就是玩。
就是一个很简单的贪心题,想到方法就试试,万一过了呢?
1 | class Solution { |
这个简单题写了一个多小时,纯纯恶心人的题,浪费时间
1 | class Solution { |
重刷了最大二叉树,发现两个有意思的点
如果递归变量数目不同,那就不能拿原函数直接递归,只能再写一个递归
二叉树的边界构建一定要始终保持一致,开始是左闭右开那就一直左闭右开,开始是闭区间就一直是闭区间,这一点在归并、快速排序中很重要
上次借助Carl的代码写出来了,这次能手撕了
1 | class Solution { |
为什么刷上面的题目呢? 因为是为下面的题目做铺垫 ^_^
设好了区间后,直接用可以求pos了
实际上这题的pos包括了两种情况,一个表达式就能搞定
1 | class Solution { |
再看看官方题解,区间设置也很有意思,它是左闭右闭区间
1 | class Solution { |
又是一个很久没写的题目,直接跪
1 | class Solution { |
惊叹于别人函数设计的巧妙性,望尘莫及
没写出来前觉得好难,经过卡尔的提示就很快写出来了。这题开始时觉得莫名其妙,为什么要这么累加,跟我想的完全不一样,结果没想到是反向累加,那就反向中序遍历就好了,顺便把之前的指针技巧给用上了
1 | class Solution { |
今天就把二叉树给收尾了,中间跳了一题不想写了,下次补上,下次见面二叉树应该是二周目了!我的定位暂时是前端,最终目标应该是sde,前端是一个快速入门的过渡阶段,