算法总结

495 阅读1分钟

hyysb.github.io/leecode/

双指针法

  • 快慢指针

注意: 快慢指针的这种方法只适用于有序数组,如果不是有序,下面的算法就是有问题的

例题:LeetCode 26. 删除排序数组中的重复项

给定(有序)数组 nums = [1,1,2],

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。

算法演示

  • 快指针用来循环原数组
  • 慢指针用来比较,如果相等就跳过,不相等的话,就赋值给慢指针
  • 因为是有序数组,不是从大到小,就是从小到大,不会出现[1,2,1,2],不然该算法就是错的

代码

var removeDuplicates = function(nums) {
    if (nums.length == 0) return 0;
    let i = 0;
    for (let j = 1; j < nums.length; j++) {
        if (nums[j] != nums[i]) {
            i++;
            nums[i] = nums[j];
        }
    }
    return i + 1;
};

滑动窗口

例题:LeetCode 3. 无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例:
输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

算法演示

  • 窗口向右推移,依次比较当前字符 s[i] 与之前的子串是否重复
  • 如果重复,则将左侧的窗口移动到与其重复字符的后面一格,去除前面的重复项

代码

 /**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
    let arr = [];
    let max = 0;
    let index;
    
    for(let i = 0; i < str.length; i++) {
        index = arr.indexOf(str[i]);
        if(index === -1) {
            arr.push(str[i]);
        } else {
            max = Math.max(arr.length, max);
            arr = arr.slice(index + 1);
            arr.push(str[i]);
        }
    }
    
    return max;
};