美文网首页
leetcode-day22-较大分组的位置[830]

leetcode-day22-较大分组的位置[830]

作者: 孙静静 | 来源:发表于2021-01-05 10:49 被阅读0次

    之前一直在Leetcode里面做完未记录,今天又想起来记录下,是因为一道题有时候用了多种方法写,在leetcode里面看不方便,既然想起来还是记录下吧。


    image.png

    解法一: 利用栈的思路
    思路: 将s转成数组,加入栈中,如果加入的字符和栈中最后一个字符相同,则累加,直到累加超过3,则加入结果数组里,这里存在一个大于3的时候重复添加的过程,所以最近结果数组再去重。
    这样写内存消耗比较大!

    let stack = [], resArr = [], resArr2 = [];
        let arr = s.split('');
        let i = -1, num = 1;
        while(arr.length > 0){
            i++;
            let item = arr.shift();
            if(stack[stack.length - 1] && stack[stack.length - 1] === item){
                num++;
                if(num>=3){
                    resArr[1] = i;
                    resArr2.push(resArr);
                }
            }else{
                num = 1;
                resArr = []
                resArr[0] = i;
                stack.push(item);
            }
        }
        return [...new Set(resArr2)];
    

    解法二: 双指针法
    思路:定义前后指针都为0,当前一个元素和后一个相同的时候,让后指针先走,直到出现元素和前一个元素不同的时候,统计后指针是否比前指针多走了2步,如果是,则将前后指针步数加入结果数组。同时在不同的时候将前后指针的步数与当前位置i保持统一。

      let start = end = 0;
        let res = [];
        for(let i=0;i<s.length;i++){
            if(s[i] === s[i+1]){
                end++
            }else{
                if(end - start >=2){
                    res.push([start, end]);
                }
                start = end = i+1;
            }
        }
        return res;
    

    相关文章

      网友评论

          本文标题:leetcode-day22-较大分组的位置[830]

          本文链接:https://www.haomeiwen.com/subject/rzeioktx.html