每日算法(第二十三期)

news/2024/7/20 17:30:42 标签: 算法, 华为od

先来回顾一下上期的问题及答案:

2023年6月14日

「最接近的三数之和」(3Sum Closest)。以下是题目的描述:

给定一个包括 n 个整数的数组 nums 和一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

示例:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 (-1 + 2 + 1 = 2) 。

以下是对应的JavaScript解答:

function threeSumClosest(nums, target) {
  nums.sort((a, b) => a - b);
  let closestSum = nums[0] + nums[1] + nums[2];

  for (let i = 0; i < nums.length - 2; i++) {
    let left = i + 1;
    let right = nums.length - 1;

    while (left < right) {
      const sum = nums[i] + nums[left] + nums[right];

      if (Math.abs(sum - target) < Math.abs(closestSum - target)) {
        closestSum = sum;
      }

      if (sum === target) {
        return sum;
      } else if (sum < target) {
        left++;
      } else {
        right--;
      }
    }
  }

  return closestSum;
}

解题思路:

  • 首先对数组 nums 进行排序,以便于使用双指针的方法进行查找。

  • 初始化一个变量 closestSum,用于记录与目标值 target 最接近的三个数的和,初始值为前三个数的和。

  • 遍历数组 nums,使用指针 i 从左往右选取第一个数字。

  • 在每个固定的数字 nums[i] 的基础上,使用双指针 leftright 分别指向剩余数组中的左右两端。

  • 计算当前三个数字的和 sum,并根据与目标值 target 的差值的绝对值判断是否更新 closestSum

  • 根据三个数字的和与目标值的关系进行移动指针:

    • 如果三个数字的和等于 target,则直接返回该和。

    • 如果三个数字的和小于 target,移动 left 指针。

    • 如果三个数字的和大于 target,移动 right 指针。

  • 最终返回 closestSum

时间复杂度分析:

  • 数组排序的时间复杂度为 O(nlogn)。

  • 双指针的移动最多需要遍历整个数组,时间复杂度为 O(n)。

  • 总体时间复杂度为 O(nlogn + n^2),简化为 O(n^2)。

空间复杂度分析:

  • 使用了常数级别的额外空间,空间复杂度为 O(1)。

2023年6月15日

「电话号码的字母组合」(Letter Combinations of a Phone Number)。以下是题目的描述:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

eb0fb8a6786bbf0cacc2f0a49b3976d2.png

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]

说明:

  • 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

解题思路:

  • 使用回溯法来构建所有可能的字母组合。

  • 定义一个映射 mappings,将数字和对应的字母数组进行关联。

  • 初始化一个空数组 combinations,用于存储所有的字母组合。

  • 编写回溯函数 backtrack,该函数接受两个参数:当前已经组合的字母字符串 current 和剩余的数字字符串 nextDigits

  • 当剩余数字字符串的长度为 0 时,说明已经遍历完所有的数字,将当前组合的字母字符串加入 combinations 数组中。

  • 如果剩余数字字符串的长度不为 0,则获取剩余数字字符串的第一个数字对应的字母数组。

  • 遍历该字母数组的每个字母,将当前字母与剩余数字字符串的子串进行递归调用 backtrack

  • 最终返回 combinations 数组,即所有可能的字母组合。

上面问题的答案会在第二天的公众号推文中公布,大家可以关注公众号:程序员每日三问,第一时间获得推送内容。

学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题(死磕自己,愉悦大家) 希望大家在这浮夸的程序员圈里保持冷静,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。


http://www.niftyadmin.cn/n/436418.html

相关文章

建模助手618 | 谁不囤点Revit插件我都会生气!

大家好&#xff0c;这里是建模助手。 早在5月份&#xff0c;我们已经就“618”这个事情高调了一番&#xff0c;以提前放“价”的姿势&#xff0c;让许多用户以躺赢的状态拉开了年中大促的序幕。&#xff08;5月购买的盆友&#xff0c;切记看完全文&#xff0c;内附彩蛋 活动反…

实验篇(7.2) 14. 站对站安全隧道 - 多条隧道负载均衡(上)(FortiGate-IPsec) ❀ 远程访问

【简介】IPsec VPN虽然价廉物美&#xff0c;但是由运营商原因&#xff0c;经常会出访问慢、不稳定甚至断开的情况&#xff0c;好在现在大多数企业都有二条甚至更多条宽带&#xff0c;我们可以创建多条IPsec VPN&#xff0c;来保证正常访问。 实验要求与环境 OldMei集团深圳总部…

Android Framework分析init进程如何启动Zygote进程

在Android系统中&#xff0c;init进程是整个系统最先启动的进程&#xff0c;它的启动过程是整个系统启动过程的第一步。init进程的主要作用是启动系统服务和应用进程&#xff0c;其中&#xff0c;Zygote进程是Android系统中的一个重要进程&#xff0c;它主要负责预热Java虚拟机…

走路的力量

走路的力量 希波克拉底有句名言&#xff1a;“行走是最好的药。” 行走在路上&#xff0c;有自然的曼妙&#xff0c;生命的极致&#xff0c;人生的远方。 既能富养身体、涤荡心灵&#xff0c;也可以沉淀阅历、升华感悟。 放松身体&#xff0c;大步向前走&#xff0c;便会拥有…

罗德FSH13手持式频谱分析仪RohdeSchwarz

FSH4和R&S?FSH8是罗德与施瓦茨公司全新推出面向未来应用的手持式频谱分析仪。它集频谱分 析、天馈线分析、全功能矢量网络分析、矢量电压表、功率计主机、宽带通信解调等多种测试功能 于一身&#xff0c;拥有媲美中高档台式频谱仪的指标。R&S?FSH4和R&S?FSH8完美…

Uniapp uni-app学习与快速上手

个人开源uni-app开源项目地址&#xff1a;准备中 在线展示项目地址&#xff1a;准备中 什么是uni-app uni&#xff0c;读 you ni&#xff0c;是统一的意思。 Dcloud即数字天堂(北京)网络技术有限公司是W3C成员及HTML5中国产业联盟发起单位&#xff0c;致力于推进HTML5发展构…

程序员面试必备的 Java 八股文,适合所有的 Java 求职者

说明 本文分享 Java 后端真实高频面试题&#xff0c;有详细答案&#xff0c;保你稳过面试。题目包括&#xff1a;Java 基础、多线程、JVM、数据库、Redis、Shiro、Spring、SpringBoot、MyBatis、MQ、ELK、SpringCloud、设计模式等。 包含从简单到困难、从高频到低频的题目&…

[细读经典]Megatron论文和代码详细分析(1)

[细读经典]Megatron论文和代码详细分析(1) 导航&#xff1a; 迷途小书僮&#xff1a;[细读经典]Megatron论文和代码详细分析(2)102 赞同 41 评论文章正在上传…重新上传取消 前言 作为一款支持multi-node&#xff0c;multi-GPU的可以直接用来训练GPT3等世界上超大规模的自然…