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

【Leetcode 1346 】 检查整数及其两倍数是否存在—— 哈希表 战胜了 糟糕的双指针

给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。

更正式地,检查是否存在两个下标 i 和 j 满足:

  • i != j
  • 0 <= i, j < arr.length
  • arr[i] == 2 * arr[j]

示例 1:

输入:arr = [10,2,5,3]
输出:true
解释:N = 10 是 M = 5 的两倍,即 10 = 2 * 5 。

示例 2:

输入:arr = [7,1,14,11]
输出:true
解释:N = 14 是 M = 7 的两倍,即 14 = 2 * 7 

示例 3:

输入:arr = [3,1,7,11]
输出:false
解释:在该情况下不存在 N 和 M 满足 N = 2 * M 。

哈希表

//哈希表
function checkIfExist2(arr: number[]): boolean {const arrMap = new Map();let ans = false;for (const n of arr) {arrMap.set(n, (arrMap.get(n) || 0) + 1);}for (const n of arr) {if ((n !== 0 && arrMap.has(2 * n)) || (n === 0 && arrMap.get(2 * n) >= 2)) {ans = true;break;}}return ans;
}

糟糕的双指针

//糟糕的双指针
function checkIfExist(arr: number[]): boolean {//排序,负数从大到小 -100 -50,正数从小到大 50 100arr = arr.sort((a, b) => (a < 0 && b < 0 ? b - a : a - b));const len = arr.length;let ans = false;//双指针let l = 0,r = Math.floor(len / 2);while (l < len - 1) {const dl = 2 * arr[l];if (arr[r] >= 0) {while (arr[r] > dl && l < r - 1) {r--;}if (arr[r] > 0) {while (arr[r] < dl && r < len - 1) {r++;}} else {while (arr[r] > dl && r < len - 1) {r++;}}} else {while (arr[r] < dl && l < r - 1) {r--;}while (arr[r] > dl && r < len - 1) {r++;}}if (arr[r] === dl) {ans = true;break;}l++;if (l === r && r + 1 < len - 1) {r++;}}return ans;
}


http://www.mrgr.cn/news/3605.html

相关文章:

  • 秘密指南!浮毛会危害人体健康吗?宠物空气净化器帮助解决危害
  • 05.震动控制继电器开关
  • 拓客工具,助你多维度筛选客源!
  • Redis系列之事务
  • 【云原生】MySQL的源码编译
  • 【微服务】微服务组件之Nacos注册中心和配置中心的使用
  • 语言基础/单向链表的构建和使用(含Linux中SLIST的解析和使用)
  • Rust 面向对象编程
  • XSS--DOM破坏案例与靶场
  • HarmonyOS开发案例:列表场景实例-TaskPool
  • http request-01-XMLHttpRequest XHR 简单介绍
  • pnpm install 后还是没有生成 pnpm-lock.yaml 文件
  • 1022. 宠物小精灵之收服
  • Java中Maven打包方式pom、jar、war的区别
  • CSS的:valid和:invalid伪类:增强表单验证的视觉反馈
  • FL Studio24.1.1中文版下载!附带破解补丁包
  • 设计模式---简单工厂模式
  • 数据治理中的角色与责任分配
  • 检测到目标URL存在http host头攻击漏洞
  • day 10 贪心算法