双指针法
- 快慢指针
注意: 快慢指针的这种方法只适用于有序数组,如果不是有序,下面的算法就是有问题的
给定(有序)数组 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;
};
滑动窗口
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: "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;
};