几个哈希表和双指针的题目

前言

二数之和是好多人刷LeetCode的第一道题,很多坚持不下来的小伙伴们,三数之和四数之和了解一下。

两数之和

这里使用哈希表来解决

function twoSum(nums, target) {
  let map = {};
  for (let i = 0; i < nums.length; i++) {
    if (map[nums[i]] !== undefined) return [map[nums[i]], i];
    else map[target - nums[i]] = i;
  }
}

三数之和

这里使用双指针来解决

function threeSum(nums) {
  nums.sort((a, b) => a - b);
  let res = [];
  for (let i = 0; i < nums.length - 1; i++) {
    if (i > 0 && nums[i] === nums[i - 1]) continue;
    let j = -nums[i],
      start = i + 1,
      end = nums.length - 1;
    while (start < end) {
      let cur = nums[start] + nums[end];
      if (cur < j) start++;
      else if (cur > j) end--;
      else {
        res.push([nums[i], nums[start], nums[end]]);
        while (nums[start] === nums[start + 1]) start++;
        while (nums[end] === nums[end - 1]) end--;
        end--;
        start++;
      }
    }
  }
  return res;
}

四数之和

同三数之和很像,如果再出五数之和你会么?

function fourSum(nums, target) {
  nums.sort((a, b) => a - b);
  let res = [];
  for (let i = 0; i < nums.length - 3; i++) {
    if (i > 0 && nums[i] === nums[i - 1]) continue;
    for (let j = i + 1; j < nums.length - 2; j++) {
      if (j > i + 1 && nums[j] === nums[j - 1]) continue;
      let k = target - nums[i] - nums[j],
        start = j + 1;
      end = nums.length - 1;
      while (start < end) {
        let cur = nums[start] + nums[end];
        if (cur < k) start++;
        else if (cur > k) end--;
        else {
          res.push([nums[i], nums[j], nums[start], nums[end]]);
          while (nums[start] === nums[start + 1]) start++;
          while (nums[end] === nums[end - 1]) end++;
          start++;
          end--;
        }
      }
    }
  }
  return res;
}
发布了362 篇原创文章 · 获赞 352 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43870742/article/details/104145005