Leetcode 16. 最接近的三数之和
方法:排序+双指针
题目
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路与算法
根据题目要求很容易想到三重循环求解,但是这种方法毫无疑问会超时,那么就进行优化。
首先拆出一次循环,枚举第一个数 a,即将问题转化为在剩余的数里寻找第二个与第三个数 b 和 c,问题就变成了在一个数组内寻找 b 和 c 满足 target - a 和 b + c 的差值最小;这里为了方便寻找要先进行排序,将数组有序化,然后使用双指针,一个指向不包括 a 及其之前元素的子数组的头,另一个指向子数组的尾;因为是有序数组,当头尾指针所指的值之和小于 target - a 时就右移头指针,大于就左移尾指针,直至选出最小差值。代码如下:
int threeSumClosest(vector<int>& nums, int target) {
int min = INT_MAX, result = 0;
sort(nums.begin(), nums.end());
for(int a = 0; a < nums.size(); a++){
int b = a + 1, c = nums.size() - 1;
while(b < c){
if(abs(nums[a] + nums[b] + nums[c] - target) < min){
min = abs(nums[a] + nums[b] + nums[c] - target);
result = nums[a] + nums[b] + nums[c];
// cout << "a: " << a << " b: " << b << " c: " << c << endl;
}
if(nums[b] + nums[c] < target - nums[a]){
b++;
}else{
c--;
}
}
}
return result;
}
题目本身难度不大,但是一开始没想到要拆开一层循环导致走了很多弯路,还是题做的少。
鉴于做的不怎么样今天再多做一道。
190. 颠倒二进制位
题目
颠倒给定的 32 位无符号整数的二进制位。
(注意是无符号整数)
题解
方法一:直接将该无符号整数转化为二进制字符串,再倒着读字符串重新转化为无符号整数,该方法过于简单故未写代码。
方法二:同方法一道理相同只不过采取按位读取无符号整数再将对应的值加到结果上。
uint32_t reverseBits(uint32_t n) {
uint32_t res = 0;
for(int i = 31; i >= 0; i--){
uint32_t x = n & 1;
res += x * pow(2, i);
n >>= 1;
}
return res;
}
该题基本没有难度,问题在于没想到用 n & 1 这种方法按位读取无符号整数。
学习笔记
昨天看了计网的第一章前几页,看的东西不多,大概就因特网的具体构成描述与服务描述,还有协议的定义、网络边缘的介绍、DSL、电缆、FTTH等接入网和双绞铜线、同轴电缆、光纤等物理链路。
网络核心部分:由互联因特网端系统的分组交换机和链路构成的网状网络
为了从源端系统向目的端系统发送一个报文,源将长报文划分为较小的数据块,称之为分组。在源和目的之间,每个分组都通过通信链路和分组交换机传送。分组以等于该链路最大传输速率的速度传输通过通信链路。
分组交换
- 多数分组交换机在链路的输入端使用存储转发传输机制,即交换机能够开始向输出链路传输该分组的第一个比特之前,必须接收到整个分组。
- 每个分组交换机有多条链路与之相连,对于每条链路都有一个相应的输出缓存,待传输的分组将进入该输出缓存。一旦缓存溢出就将产生丢包。
- 接下来路由器获得分组后,根据自身的转发表确定分组要转发的地址,而因特网本身具有一些特殊的路由选择协议用于自动地设置这些转发表。
电路交换
通过网络链路和交换机传输数据不仅可以分组交换,还可以电路交换。在电路交换网络中,在端系统间通信会话期间,预留了端系统间通信沿路径所需要的资源(缓存、链路传输速率);在分组交换中,这些资源不会预留。电路交换中,发送方和接收方以及路径上的所有交换机都将为该连接维护连接状态。
- 链路中的电路是通过频分复用(Frequency-Division Multiplexing, FDM) 或 时分复用(Time-Division Multiplexing, TDM) 实现的,频分复用即将每个电路分配一个特殊的频段,而时分复用则是将时间片分给各个电路。
- 分组交换与电路交换各有长处,但电路交换存在的劣势相对较大、资源难以充分利用,目前的趋势无疑是朝着分组交换方向发展的。
分组交换的时延:节点处理时延、排队时延、传输时延、传播时延
今天看的也不多,还是太懒了,第一章还没看完。
《坟墓》
又到了每天最喜欢的讲故事环节,今天的仍是洛夫克拉夫特的小说,预计接下来两个月都是。《坟墓》写于1917年6月,据译者称 “有明显模仿爱伦.坡的痕迹”, 至于爱伦.坡是谁,我就不知道了。不过这篇小说明显能看到日后洛夫克拉夫特的写作风格,与前两篇不同,故事明显开始具有代入感,完全能体会主人公所经历的事情。剧情基本就是夺舍那一类故事,主人公发现了个坟墓,被里面因亵渎神灵而最后无法下葬的鬼魂当成宿主了,然后举止怪异被送进了精神病院,不过通过作者的描写明显更加疯狂、更吸引人,主人公相较其他人命运已经很好了(至少没被干掉、献祭或吓疯了啥的)。从这里开始,洛夫克拉夫特的作品渐渐有点像恐怖小说了,之前的《炼金术士》真是完全没感觉到“恐怖”两个字 ,都是针对被害人内心煎熬的描写,我感觉《坟墓》远远强于《炼金术士》。
PS:明天是《大衮》,可以看到触手啦~