当前位置: 首页 > news >正文

LeetCode热题100(JavaScript)

哈希

两数之和

暴力解法

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

Map法

var twoSum = function(nums, target) {const map = new Map()for(let i=0;i<nums.length;i++){let key = target-nums[i]if(map.has(key)){return [map.get(key),i]}else{map.set(nums[i],i)}  }return []
};

字母异味词分组

/*** @param {string[]} strs* @return {string[][]}*/
var groupAnagrams = function(strs) {let map = new Map();  for (let i = 0; i < strs.length; i++) {  let word = strs[i];  // 使用数组的 sort 方法对字符串的字符进行排序,并将排序后的字符数组重新连接成字符串  let sorted_word = word.split('').sort().join('');  if (map.has(sorted_word)) {  map.get(sorted_word).push(word);  } else {  map.set(sorted_word, [word]);  }  }  // 将Map中的值(数组)转换为数组返回  return [...map.values()];  
};

最长连续序列

var longestConsecutive = function(nums) {if (nums.length === 0) return 0;  let set = new Set(nums);  let maxSize = 0;  for (let num of set) {  // 跳过非连续序列的起始数字(即那些前面有数字的数字)  if (!set.has(num - 1)) {  let currentNum = num;  let currentLength = 1;  // 遍历连续序列  while (set.has(currentNum + 1)) {  currentNum++;  currentLength++;  }  // 更新最大长度  maxSize = Math.max(maxSize, currentLength);  }  }  return maxSize; 
};

双指针

移动零

解法1

先遍历数组,计算非零元素的数量。然后,在第二次遍历中,只将非零元素复制回数组的前部,并跳过0。

function moveZeroes(nums) {  let count = 0;   for (let num of nums) {  if (num !== 0) {  count++;  }  }  let writeIndex = 0;   for (let num of nums) {  if (num !== 0) {  nums[writeIndex++] = num;  }   }  // 填充剩余的0for (let i = writeIndex; i < nums.length; i++) {  nums[i] = 0;  } return nums
}  

解法2

  1. 初始化两个指针,slow 和 fast,都指向数组的第一个元素。
  2. 遍历数组(fast 从头到尾),对于每个 nums[fast]
    • 如果 nums[fast] 不为 0,则交换 nums[slow] 和 nums[fast],并将 slow 向后移动一位(slow++)。
    • 如果 nums[fast] 为 0,则只移动 fast 指针。
  3. 遍历结束后,所有非零元素都已经被移动到了数组的前面,而后面的元素则自动成为了 0
var moveZeroes = function(nums) {let slow=0let fast = 0for(fast;fast<nums.length;fast++){if(nums[fast]!=0){let swap = nums[slow]nums[slow] = nums[fast]nums[fast] = swapslow++}}return nums
};

盛最多水的容器

  1. 初始化左指针 left 为 0,右指针 right 为 height.length - 1
  2. 进入循环,当 left < right 时执行以下步骤:
    • 计算当前容器的面积 area = Math.min(height[left], height[right]) * (right - left)
    • 更新最大面积 maxArea(如果 area 大于 maxArea)。
    • 如果 height[left] < height[right],则 left++(移动左指针),否则 right--(移动右指针)。
  3. 退出循环后,maxArea 就是所求的最大面积。
var maxArea = function(height) {let left = 0let right = height.length-1let max = 0while(left<right){let h1 = height[left]let h2 = height[right]let area = Math.min(h1, h2) * (right - left)max = Math.max(max, area);  if (h1 > h2) {  right--;  } else {  left++;  } }return max
};

三数之和

  1. 排序:首先对输入的数组nums进行排序。这是为了之后能够使用双指针技术有效地查找匹配项。

  2. 初始化:定义结果数组res来存储找到的三元组,以及定义指针ileftright分别用于遍历数组和作为双指针。

  3. 遍历数组:使用外层循环遍历数组nums,其中i是第一个数的索引。为了避免找到重复的三元组,如果当前元素与前一个元素相同,则跳过。

  4. 双指针查找:在内层循环中,使用leftright两个指针,在i之后的元素中查找满足nums[i] + nums[left] + nums[right] == 0的另外两个数。lefti+1开始,right从数组末尾开始。

  5. 计算和并调整指针:计算当前三个数的和sum。如果sum等于0,说明找到了一个满足条件的三元组,将其添加到结果数组中,并移动leftright指针,同时跳过所有相同的元素,以避免重复的三元组。如果sum小于0,说明和太小,需要增加,因此将left指针右移。如果sum大于0,说明和太大,需要减小,因此将right指针左移。

  6. 返回结果:当遍历完整个数组后,所有满足条件的三元组都已被添加到结果数组中,返回结果数组。

var threeSum = function(nums) {// 首先对数组进行排序  nums.sort((a, b) => a - b);  const result = [];  let n = nums.length;  // 遍历数组(除了最后两个元素,因为需要至少两个元素与当前元素相加)  for (let i = 0; i < n - 2; i++) {  // 跳过所有与当前nums[i]相同的元素,以避免重复的三元组  if (i > 0 && nums[i] === nums[i - 1]) continue;  let left = i + 1;  let right = n - 1;  // 使用双指针在nums[i]之后的元素中查找  while (left < right) {  const sum = nums[i] + nums[left] + nums[right];  if (sum === 0) {  // 找到一个和为0的三元组,添加到结果中  result.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) {  // 和小于0,说明需要增加和的值,因此左指针右移  left++;  } else {  // 和大于0,说明需要减少和的值,因此右指针左移  right--;  }  }  }  return result;  
};

滑动窗口

无重复字符的最长字串

var lengthOfLongestSubstring = function(s) {  let left = 0  let maxLength = 0  let map = new Map()  for(let right=0;right<s.length;right++){  if(map.get(s[right])>=left){  left = map.get(s[right])+1  }  map.set(s[right],right)  maxLength = Math.max(maxLength,right-left+1)  }  return maxLength  
};

相关文章:

  • HTTP状态码(HTTP Status Code)讲解
  • k8s上部署openvpn
  • IP地址:由电脑还是网线决定?
  • 【产品评测】海康威视(HIKVISION)NAS网络存储——简单评测
  • PostgreSQL安装/卸载(CentOS、Windows)
  • docker 部署wechatbot-webhook 并获取接口实现微信群图片自动保存到chevereto图库等
  • 计算机网络入门 -- 常用网络协议
  • el-menu弹出菜单样式不生效
  • 十一、数组(1)
  • 7.SpringBoot整合Neo4j
  • Python求均值,方差,标准差
  • 【运维】软件运维方案(2024word完整版)
  • 减分兔搜题-12123学法减分20题目及答案 #媒体#职场发展
  • 排序系列 之 快速排序
  • Mybatis plus自定义分页
  • Apache的基本使用
  • canvas 绘制双线技巧
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • es的写入过程
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • java多线程
  • Mac转Windows的拯救指南
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL用户中的%到底包不包括localhost?
  • Mysql优化
  • Nacos系列:Nacos的Java SDK使用
  • Objective-C 中关联引用的概念
  • ReactNative开发常用的三方模块
  • spring boot 整合mybatis 无法输出sql的问题
  • vue2.0项目引入element-ui
  • Vultr 教程目录
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 理清楚Vue的结构
  • 双管齐下,VMware的容器新战略
  • 微服务框架lagom
  • 用Canvas画一棵二叉树
  • 终端用户监控:真实用户监控还是模拟监控?
  • 追踪解析 FutureTask 源码
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​补​充​经​纬​恒​润​一​面​
  • # 计算机视觉入门
  • #pragma once与条件编译
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (145)光线追踪距离场柔和阴影
  • (4)STL算法之比较
  • (LeetCode 49)Anagrams
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (二)springcloud实战之config配置中心
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)c52学习之旅-流水LED灯