背景

记录一下,工作之所刷的 leetcode 题目。

01.twoSum

/** * @param {number[]} nums * @param {number} target * @return {number[]} */var twoSum = function (nums, target) {  for (var i = 1; i < nums.length; i++) {    const idx = nums.indexOf(target - nums[i]);    if (idx > -1 && idx !== i) {      return [i, idx];    }  }  return [];};

15.threeSum

/** * @param {number[]} nums * @return {number[][]} */// Given array nums = [-1, 0, 1, 2, -1, -4],// A solution set is:// [//   [-1, 0, 1],//   [-1, -1, 2]// ]var threeSum = function (nums) {  const result = [];  const length = nums.length;  if (length === 3) return [nums];  var sortedNums = num.sort((a, b) => a - b);  for (let i = 0; i < l; i++) {    if (i !== 0 && sortedNums[i] === sortedNums[i - 1]) continue;    var j = i + 1;    var k = l - 1;    while (j < k) {      var sum = temp[i] + temp[j] + temp[k];      if (sum === 0) {        res.push([temp[i], temp[j], temp[k]]);        while (j++ < k && temp[j - 1] === temp[j]) {          /* do nothing*/        }        while (k-- > j && temp[k] === temp[k + 1]) {          /* do nothing*/        }      } else if (sum < 0) {        j++;      } else {        k--;      }    }  }  return result;};

70.climbStairs

/** * @param {number} n * @return {number} */var climbStairs = function (n) {  const array = [0, 1, 2];  for (var i = 3; i <= n; i++) {    array[i] = array[i - 1] + array[i - 2];  }  return array[n];};

283.moveZeroes

/** * @param {number[]} nums * @return {void} Do not return anything, modify nums in-place instead. */var moveZeroes = function (nums) {  var validNumberCount = 0;  for (var i = 0; i < nums.length; i++) {    if (nums[i] !== 0) {      nums[validNumberCount] = nums[i];      validNumberCount++;    }  }  for (var j = validNumberCount; j < nums.length; j++) {    nums[j] = 0;  }  return nums;};

11.maxArea

/** * @param {number[]} height * @return {number} *///  solution 1: 暴力双循环var maxArea = function (height) {  var max = 0;  for (var i = 0; i < height.length; i++) {    for (var j = i + 1; j < height.length; j++) {      max = Math.max(max, (j - i) * Math.min(height[i], height[j]));    }  }  return max;};//  solution 1: 双指针var maxArea = function (height) {  var max = 0;  var left = 0, right = height.length - 1;  while (left < right) {    var area = (right - left) * Math.min(height[left], height[right]);    max = Math.max(max, area);        if (height[left] < height[right]) {      left++;    } else {      right--;    }  }  return max;};

84.largestRectangleArea

/** * @param {number[]} heights * @return {number} */// ## 柱状图中最大的矩形// solution1: 暴力循环var largestRectangleArea = function (heights) {  var maxArea = 0;  for (var i = 0; i < heights.length; i++) {    for (j = i; j < heights.length; j++) {      var minHeight = Number.MAX_VALUE;      for (var k = i; k <= j; k++) {        minHeight += Math.min(minHeight, heights[k]);      }      maxArea = Math.max(maxArea, minHeight * (j - i + 1));    }  }  return maxArea;};// solution2: 最小栈// TODO

239.maxSlidingWindow

/* * @lc app=leetcode.cn id=239 lang=javascript * * [239] 滑动窗口最大值 */// @lc code=start/** * @param {number[]} nums * @param {number} k * @return {number[]} */// 解法1: 暴力var maxSlidingWindow = function (nums, k) {  var length = nums.length;  if (!length) return [];  var res = [];  for (var i = 0; i < length - (k - 1); i++) {    let max = Number.MIN_SAFE_INTEGER;    for (j = i; j < i + k; j++) {      max = Math.max(max, nums[j]);    }    res.push(max);  }  return res;};// @lc code=end

289.rotateArray

/** * @param {number[]} nums * @param {number} k * @return {void} Do not return anything, modify nums in-place instead. */// solution 1: 暴力, 每次移动一个var rotate = function (nums, k) {  let previous;  for (var i = 0; i < k; i++) {    previous = nums[nums.length - 1];    for (var j = 0; j < nums.length; j++) {      [previous, nums[j]] = [nums[j], previous];    }  }};

88.mergeTwoArray

/** * @param {number[]} nums1 * @param {number} m * @param {number[]} nums2 * @param {number} n * @return {void} Do not return anything, modify nums1 in-place instead. */// 解法1: 合并后排序var merge = function (nums1, m, nums2, n) {  for (var i = 0; i < nums2.length; i++) {    nums1[m + i] = nums2[i];  }  nums1.sort((a, b) => a - b);};// 解法2: 判断元素大小, 直接插入var merge = function (nums1, m, nums2, n) {  let length = m + n;  while(n > 0) {    if(m <= 0) { // num1中的元素已经排完, 剩下的nums直接放进来      nums1[--length] = nums2[--n];      continue;    }    nums1[--length] = nums1[m-1] > nums2[n-1] ? nums1[--m] : nums2[--n];  }};

21.mergeTwoLists

/** * Definition for singly-linked list. * function ListNode(val) { *     this.val = val; *     this.next = null; * } *//** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */var mergeTwoLists = function (l1, l2) {  if (l1 === null) return l2;  if (l2 === null) return l1;  if (l1.val < l2.val) {    l1.next = mergeTwoLists(l1.next, l2);    return l1;  } else {    l2.next = mergeTwoLists(l2.next, l1);    return l2;  }};

42.trap 接雨水

/** * @param {number[]} height * @return {number} */var trap = function (height) {  let capacity = 0;  const stack = [];  for (let i = 0; i < height.length; i++) {    while (stack.length !== 0 && height[stack[stack.length - 1]] < height[i]) {      let cur = stack[stack.length - 1];      stack.pop();      if (stack.length === 0) {        break;      }      let l = stack[stack.length - 1];      let r = i;      capacity += (Math.min(height[l], height[r]) - height[cur]) * (r - l - 1);    }    stack.push(i);  }  return capacity;};