每日算法(第二十二期)

news/2024/7/20 18:43:47 标签: 算法, 华为od

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

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

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c,使得 a + b + c = 0?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

示例说明:

  • 应该返回所有满足题意且不重复的三元组。

  • 解集不能包含重复的三元组。

以下是对应的JavaScript解答:

function threeSum(nums) {
  const result = [];

  nums.sort((a, b) => a - b);

  for (let i = 0; i < nums.length - 2; i++) {
    if (i > 0 && nums[i] === nums[i - 1]) {
      continue; // 跳过重复的数字
    }

    let left = i + 1;
    let right = nums.length - 1;

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

      if (sum === 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) {
        left++;
      } else {
        right--;
      }
    }
  }

  return result;
}

解题思路:

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

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

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

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

    • 如果三个数字的和等于 0,将结果添加到 result 数组中,并分别移动 leftright 指针。

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

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

  • 在移动指针时,需要跳过重复的数字,以避免重复的解。

  • 最终返回结果数组 result

时间复杂度分析:

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

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

  • 总体时间复杂度

为 O(nlogn + n^2),简化为 O(n^2)。

空间复杂度分析:

  • 使用了一个结果数组来存储符合条件的三元组,空间复杂度取决于结果的数量,最坏情况下为 O(n)。

2023年6月13日

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

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

示例:

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

解题思路:

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

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

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

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

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

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

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

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

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

  • 最终返回 closestSum

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

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


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

相关文章

JavaScript笔记——快速了解 ES6 新增数组方法,开箱即用(含案例)

文章目录 &#x1f4cb;前言&#x1f3af;Array.from()&#x1f3af;Array.of()&#x1f3af;Array.find()&#x1f3af;Array.findIndex()&#x1f3af;Array.includes()&#x1f3af;Array.flat()&#x1f3af;Array.flatMap()&#x1f3af;Array.every()&#x1f3af;Array.…

【笔试强训选择题】Day25.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

MySQL中的IF语句使用

MySQL中的IF语句 在 MySQL 数据库中&#xff0c;IF 语句是一种常见的条件控制语句。它可以根据指定的条件返回不同的结果。在本文中&#xff0c;我们将介绍 IF 语句的基本用法以及实际应用场景。 IF函数 MySQL 提供了 IF 函数来实现 IF 语句。IF 函数的语法如下&#xff1a;…

总结一下一路开发邮件服务器遇到的事

这里写自定义目录标题 集成第三方做个邮件收发一直在正常发件一段时间后 集成第三方做个邮件收发 需求是很简单的&#xff0c;刚开始什么都很顺一下就开发完了&#xff0c;邮件收发很顺。 几个月后&#xff0c;遇到的第一个问题&#xff0c;邮件发不了错误号 526 Authenticati…

css自学框架之容器

学习自己开发CSS框架&#xff0c;起步代码之容器部分代码&#xff1a; html, body,dl, dt, dd, ol, ul,h1, h2, h3, h4, h5, h6,pre, code, form, p,fieldset, legend, figure{margin: 0; padding: 0;}*, *:before, *:after{ box-sizing: border-box } /*box-sizing: border-b…

工具篇--4.1RabbitMq--常用配置参数详解

前言&#xff1a; 在使用Rabbitmq 过程中&#xff0c;每次配置参数都需要进行搜索和回忆&#xff0c;本文对rabbitmq 中常用的配置成参数进行列举并解释&#xff1b; 这里先粘下比较常用的参数及其简单注注释&#xff0c;更为详细的注释可以在文章中后面的部分进行解读&#x…

面试问题总结---嵌入式部分和项目部分

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作后…

驾驶舱数据指标体系设计

大数据时代下&#xff0c;各行各业面对众多的顾客和复杂多变的市场需求&#xff0c;要想及时适应市场变化&#xff0c;掌握市场动态&#xff0c;就需要对各个环节的数据进行分析&#xff0c;得到科学有效的结论来指导决策&#xff0c;这就离不开领导驾驶舱。 — 01 — 什么是…