算法高频题系列: 三数之和问题 && 有效的括号

110 阅读2分钟

算法高频题系列: 三数之和问题 && 有效的括号

  • 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; 欢迎交流;