自学内容网 自学内容网

leetcode刷题记录

2024.10.18

1.两数之和 复杂度O(n2)【哈希、数组】

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      if (nums[j] + nums[i] === target) {
        return [i, j];
      }
    }
  }
};

哈希法,O(n)复杂度
复习了一下map的基本用法
mp.has(t):查询t是否存在在map中
mp.get(key):通过键值拿到value值
mp.set(key, value):设置键值对

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
  const mp = new Map();
  for (let i = 0; i < nums.length; i++) {
    if (mp.has(target - nums[i])) {
      return [mp.get(target - nums[i]), i];
    }
    mp.set(nums[i], i);
  }
};

49. 字母异位词分组【哈希】

先排序,在判断
array.split(''):分割
array.sort(''):排序
array.join(''):组合
map的基本用法

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
  let res = [];
  let mp = new Map();
  for (let i = 0; i < strs.length; i++) {
    const newStr = strs[i].split('').sort().join('');
    if (mp.has(newStr)) {
      res[mp.get(newStr)].push(strs[i]);
    } else {
      mp.set(newStr, res.length);
      res.push([strs[i]]);
    }
  }
  return res;
};

128. 最长连续序列

时间复杂度O(nlog(n))
排序后判断连续:容易踩坑的点在最开始和最后面的判断与赋值
注意数字重复的情况

/**
 * @param {number[]} nums
 * @return {number}
 */
var longestConsecutive = function(nums) {
  if (nums.length === 0) return 0;
  const newNums = nums.sort((a, b) => a - b);
  console.log(newNums);
  let cnt = 1, maxCnt = 1;
  for (let i = 1; i < newNums.length; i++) {
    const num = newNums[i], preNum = newNums[i - 1];
    if (num === preNum + 1) {
      cnt++;
    } else if (num !== preNum) {
      maxCnt = cnt > maxCnt ? cnt : maxCnt;
      cnt = 1;
    }
  }
  maxCnt = cnt > maxCnt ? cnt : maxCnt;
  return maxCnt;
};

11. 盛最多水的容器

双指针+两边夹
水桶效益、这个需要一点数学理解
总的高度较短的个指针先往中间一动

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
  let i = 0, j = height.length - 1;
  let maxContent = 0;
  while (i < j) {
    const w = j - i;
    const h = Math.min(height[i], height[j]);
    maxContent = Math.max(maxContent, w * h);
    if (height[i] > height[j]) {
      j--;
    } else {
      i++;
    }
  }
  return maxContent;
};

42. 接雨水
脑细胞要死光了,只考虑到了左高右低的情况,还要改,写点简单的轻松一下

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {  
  const len = height.length;
  if (len < 3) return 0;

  let slow = 0, fast = 0;
  let left;
  let res = 0;
  // 在每一个迭代中,slow为左高点, 只要右高点的高度>=左高点,即判断一个凹处理完毕
  // 迭代找凹
  while(slow < len && fast < len) {
    // 保证slow的下一个一定比他低
    while(slow + 1 < len && height[slow + 1] >= height[slow]) slow++;
    console.log('-------------------------------');
    left = height[slow];
    console.log('找到slow点了吗', slow, ', left:', left)
    fast = slow + 1;
    blackContent = 0;// (,) 不计算左、右高点柱子
    while(fast < len && height[fast] < left) {
      // s 为左高点
      blackContent += height[fast];
      fast++;
    }
    //fast 为右高点 
    // 如果找不到右高点,就已经到了尾巴,就找次高点
    if (fast === len) {
    console.log('到访天刚', fast, ', left:', height[fast]);
    console.log('到访天刚', slow, ', right:', height[slow]);
      break;
    }
    console.log('找到fast点了吗', fast, ', right:', height[fast]);
    console.log('blackContent: ', blackContent);
    // 右高点 == l,或者 > l
    res += ((left * (fast - slow - 1)) - blackContent);
    console.log('res: ', res);
    // 每一找凹的迭代中,left和slow参数是不变的,定位了凹字的左高点
    // 每一轮迭代后,维护更新左高点 
    slow = fast;
    console.log('-------------------------------');
  }
  const st = slow;
  if (fast === len) {
    fast -= 1;
    slow = fast;
    while (fast)
    // 保证fast的下一个一定比他低
    while(slow + 1 < len && height[slow + 1] >= height[slow]) slow++;
    console.log('---------------a----------------');
    left = height[slow];
    console.log('找到slow点了吗', slow, ', left:', left)
    fast = slow + 1;
    blackContent = 0;// (,) 不计算左、右高点柱子
    while(fast < len && height[fast] < left) {
      // s 为左高点
      blackContent += height[fast];
      fast++;
    }
    //fast 为右高点 
    // 如果找不到右高点,就已经到了尾巴,就找次高点
    if (fast === len) {
    console.log('到访天刚', fast, ', left:', height[fast]);
    console.log('到访天刚', slow, ', right:', height[slow]);
      break;
    }
    console.log('找到fast点了吗', fast, ', right:', height[fast]);
    console.log('blackContent: ', blackContent);
    // 右高点 == l,或者 > l
    res += ((left * (fast - slow - 1)) - blackContent);
    console.log('res: ', res);
    // 每一找凹的迭代中,left和slow参数是不变的,定位了凹字的左高点
    // 每一轮迭代后,维护更新左高点 
    slow = fast;
    console.log('-------------------------------');
    
  }
  return res;
};



































原文地址:https://blog.csdn.net/shifff/article/details/143035696

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!