算法高频题系列: 三数之和问题 && 有效的括号
-
Thinking:
自己是2月份中旬开始注册公众号然后写文章的,现在也有两个月了,所以有必要确定一下自己公众号的主要方向了,目前的想法是主要是记录一下流行的框架,并使用该框架搭建基本项目的一些实践, 另一个方向就是记录算法题目,毕竟现在进大厂都是要刷算法的,更新的进度希望是一个月更新两次,平均下来就是两周更新一次的样子,设定一个时间表出来,并按照时间表来执行; 那我们就开始吧;
-
question:
1.三数之和问题;
三数之和问题的解法有很多,说一种直接的解法,使用twoSum 求解; twoSum 求解不是一个较优的解法,下面我说一下使用双指针进行求解:
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
// 仿照国际站most votes 的解法;
nums.sort((a , b) => a - b);
let result = [];
for (let i = 0;i < nums.length - 2;i++){
if (i == 0 || (i > 0 && nums[i] != nums[i-1])) {
let lo = i + 1, hi = nums.length - 1, sum = 0 - nums[i];
while (lo < hi) {
if (nums[lo] + nums[hi] == sum) {
result.push([nums[i], nums[lo] , nums[hi] ]);
while (lo < hi && nums[lo] == nums[lo+1]) lo++;
while (lo < hi && nums[hi] == nums[hi-1]) hi--;
lo++; hi--;
} else if (nums[lo] + nums[hi] < sum) lo++;
else hi--;
}
}
}
return result;
};
使用双指针来判断三者之和是不是零,for 循环中叠加while 是一种优雅的解法,可以根据lo 和 hi 来从数组中取符合要求的数;
两数之和问题就不再这里写了, 使用target - nums[i] 结合indexOf 就可以实现;
2.有效的括号: leetcode原题
这道题的解法是使用栈来做,那么为什么能联想到栈呢,使用栈求解的话,该题需要符合层级之间相关性的特征,一层一层的拨开,每一层之间是有联系的,符合这种特征的话,就使用栈求解比较方便;
那么这里我写一下关于这题的解法: 首先写一下暴力求解的思路:
遍历括号字符串,符合条件的就变为空,直到最后;
栈的解法是左括号的话就一直入栈,遇到右括号的情况就出栈,看是否和左括号匹配;
使用栈的解法:
let stock = [];
let len = s.length;
for (let item of s) {
switch(item) {
case '{':
case '(':
case '[':
stock.push(item);
break;
case '}':
if(stock.pop() !== '{'){
return false;
}
break;
case ')':
if(stock.pop() !== '('){
return false;
}
break;
case ']':
if(stock.pop() !== '['){
return false;
}
break;
}
}
return !stock.length;
欢迎关注我:
个人微信: Yingbin192; 欢迎交流;