刷 leetcode三个数的最大乘积 | 刷题打卡

简介: 刷 leetcode三个数的最大乘积 | 刷题打卡

刷 leetcode三个数的最大乘积 | 刷题打卡


一、题目描述:

原题地址

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

提示:

3 <= nums.length <= 104 -1000 <= nums[i] <= 1000

示例 1:
输入:nums = [1,2,3]
输出:6
示例 2:
输入:nums = [1,2,3,4]
输出:24
示例 3:
输入:nums = [-1,-2,-3]
输出:-6

二、思路分析:

我的思路:

  • 先从小到大排序
  • 全是负数,肯定后三者乘积
  • 没有负数,肯定后三者乘积
  • 1个负数,还是后三者乘积
  • 2个负数或者以上,要看看2个负数*最后一个的乘积和后三者的乘积哪个大

别人的思路1:

  • 先从小到大排序
  • 全是负数,后三者乘积
  • 全是非负数,后三者乘积
  • 有正有负,比较前两乘积和后三者的乘积谁大

简化了罗里吧嗦的判断,这里还巧用了Math.max

别人的思路2:

  • 其实这里需要最大的三个数和最小的两个数,所以不需要挨个排序
  • 后面逻辑一样

哇哦,也是哦,不用挨个排序

三、AC 代码:

我的土鳖写法

const maximumProduct = function (nums) {
  const len = nums.length;
  if (len === 3) {
    return nums[len - 1] * nums[len - 2] * nums[len - 3];
  }
  nums.sort((a, b) => a - b);
  console.log(nums);
  const lastBefore2 = nums[len - 2] * nums[len - 3];
  const last3 = nums[len - 1] * lastBefore2;
  // 最小的都大于0,说明没有负数
  const noHasLessThan0 = nums[0] >= 0;
  // 最小的小于0,第二小的大于0,说明只有一个负数
  const hasOneLessThan0 = nums[0] < 0 && nums[1] >= 0;
  // 最大的小于0,说明全是负数
  const allLessThan0 = nums[len - 1] < 0;
  if (noHasLessThan0 || hasOneLessThan0 || allLessThan0) {
    return last3;
  }
  const before2 = nums[0] * nums[1];
  // const hasTwoLessThan0 = nums[0] < 0 && nums[1] < 0;
  return before2 < lastBefore2 ? last3 : before2 * nums[len - 1];
};

别人的全部排序写法:

const maximumProduct = function (nums) {
  const len = nums.length;
  nums.sort((a, b) => a - b);
  return Math.max( nums[len - 1] * nums[len - 2] * nums[len - 3], nums[len - 1] * nums[0] * nums[1]);
};

别人的非全部排序写法:

var maximumProduct = function(nums) {
    // 最小的和第二小的
    let min1 = Number.MAX_SAFE_INTEGER, min2 = Number.MAX_SAFE_INTEGER;
    // 最大的、第二大的和第三大的
    let max1 = -Number.MAX_SAFE_INTEGER, max2 = -Number.MAX_SAFE_INTEGER, max3 = -Number.MAX_SAFE_INTEGER;
    for (const x of nums) {
        if (x < min1) {
            min2 = min1;
            min1 = x;
        } else if (x < min2) {
            min2 = x;
        }
        if (x > max1) {
            max3 = max2;
            max2 = max1;
            max1 = x;
        } else if (x > max2) {
            max3 = max2;
            max2 = x;
        } else if (x > max3) {
            max3 = x;
        }
    }
    return Math.max(min1 * min2 * max1, max1 * max2 * max3);
};

四、总结:

  • 在复杂度不增加的情况下,简化代码,让其更易读
  • 排序不一定挨个排序,简化思路
  • 怎么找到最小的两个数
  • 巧用Math.max
目录
相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
55 6
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
47 4
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
108 2
|
12天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
14 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
54 7
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
26 4
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
52 5
|
3月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
50 3