Skip to content

双指针

删除有序数组中的重复项

js
const removeRepeat = function(arr) {
  let first = 0;
  let slow = 0;
  while(first < nums.length) {
      if(nums[first] !== nums[first - 1]) {
          nums[slow] = nums[first]
          slow++
      }
      first++
  }
  return slow;
}

删除有序数组中的重复项 II

js
var removeDuplicates = function(nums) {
    let slow = 2;
    let fast = 2;
    while(fast < nums.length) {
        if(nums[slow - 2] != nums[fast]){
            nums[slow] = nums[fast];
            slow++
        }
        fast++
    }
    return slow
};

移动零

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

盛最多水的容器

js
const maxArea = function(arr) {
  let max = 0, l = 0, r = arr.length - 1
  while(l < r) {
    max = Math.max(max, Math.min(arr[l], arr[r]) * ( r - l))
    if (arr[l] < arr[r]) {
      l++
    } else {
      r--
    }
  }
  return max
}

三数之和

js
var threeSum = function(nums) {
  const len = nums.length;
  let res = [];
  if(len < 3) return res
  nums.sort((a, b) => a - b);

  for(let i = 0; i < nums.length; i++) {
    if(nums[i] > 0) break;
    if(i > 0 && nums[i] === nums[i - 1]) continue;
    let left = i + 1;
    let right = len - 1;
    while(left < right) {
      const sum = nums[left] + nums[right] + nums[i];
      if(sum === 0) {
        res.push([nums[i], nums[left], nums[right]])

        while(left < right && nums[left] === nums[left + 1]) {
          left++
        }
        while(left < right && nums[right] === nums[right - 1]) {
          right--
        }
        left++
        right--
      } else if(sum < 0) {
        left++
      } else {
        right--
      }
    }
  }
  return res
};

验证回文串

js
var isPalindrome = function(s) {
  s = s.replace(/([^a-zA-Z0-9])/g, '');
  s = s.toLocaleLowerCase();
  let l = 0;
  let r = s.length - 1;
  while(l < r) {
    if(s[l] !== s[r]) {
      return false
    }
    l++
    r--
  }
  return true;
};

判断子序列

js
var isSubsequence = function(s, t) {
  let slow = 0;
  let first = 0;
  while(first < t.length) {
    if(s[slow] === t[first]) {
      slow++
    }
    if(slow >= s.length) return true 
    first++
  } 
  return slow >= s.length
};

两数之和 II - 输入有序数组

js
var twoSum = function(numbers, target) {
  let left = 0;
  let right = numbers.length - 1;
  while (true) {
    let s = numbers[left] + numbers[right];
    if (s === target) {
      return [left + 1, right + 1];
    }
    s > target ? right-- : left++;
  }
};

Released under the MIT License.