题目描述

给你一个整数数组 nums,请你选择数组的两个不同下标 ij,使 (nums[i]-1)*(nums[j]-1) 取得最大值。

请你计算并返回该式的最大值。

示例 1:

输入:nums = [3,4,5,2]
输出:12
解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)*(nums[2]-1) = (4-1)*(5-1) = 3*4 = 12 。

示例 2:

输入:nums = [1,5,4,5]
输出:16
解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。

示例 3:

输入:nums = [3,7]
输出:12

提示:

2 <= nums.length <= 500
1 <= nums[i] <= 10^3

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/maximum-product-of-two-elements-in-an-array

题目分析

从描述中可以得出以下几个解题关键信息:

  1. 同一个数组,但下标不同的两个数
  2. 从所有结果中取最大值,即nums[i]和nums[j]是数组中最大的两个数

解题思路

暴力解法

能否简单的使用双重循环暴力破解呢?不能,因为暴力破解会存在下标i=j的情况,假设nums[i]是数组中最大的值,那么就nums[i]=nums[j],这两个数相乘就成了最大的结果了。所以不能简单的使用双重循环。

优化后的暴力解法

题目的关键信息是i和j不同,那么在双重循环中去除掉i=j的情况不就行了?

举个栗子,i和j循环的所有值是i=1,2,3....;j=1,2,3....;进行双重循环的时候i=1,j从1开始到nums.length-1,将i=j的情况去掉就是在初始化时让j=i+1。同理当i=2时,j也不能小于2,因为当i=1的时候已经计算了[1,2]的结果。所以为了降低时间复杂度,不能再计算[2,1]的结果了。所以j>i即j=i+1。代码如下:

public int maxProduct(int[] nums) {
//时间复杂度O(n^2) 时间换空间
int max = 0;
for(int i=0;i<nums.length;i++) {
for(int j = i+1;j<nums.length;j++) {
max = Math.max((nums[i]-1)*(nums[j]-1), max);
}
} return max;
}

排序解法

既然是要取数组中两个不同的最大值,那么直接先进行排序然后取最前或者最后两个数不就行了?采用快速排序,平均时间复杂度为O(nlog2n)。代码就不列出了,网上很多实现。

空间换时间解法

能不能只进行一次遍历就解决呢?可以。

既然要保证取到最大的两个数,那么是不是可以给两个变量n1、n2,每次从nums数组中取一个数值替换n1、n2中更小的那个呢?这样nums数组只需要一次遍历,n1、n2也一直保证是当前遍历到的nums数组中最大的两个数。代码如下:

public int maxProduct(int[] nums) {
//时间复杂度O(n),每次都将两个数里面最小的替换掉 空间换时间
int n1=0,n2=0;
for(int i=0;i<nums.length;i++) {
if(n1<=n2) {
n1=Math.max(nums[i], n1);
} else {
n2=Math.max(nums[i], n2);
}
} return (n1-1)*(n2-1);
}

总结

思维扩展

从这一道题想到了另外一题,如:给定一个数组,从中随机取3个数,共有多少种取法。

就是一个排列组合的问题,其实也是要去除重复的组合,可以采用暴力解法的优化方式去解,只是循环变成了三重。

leetcode-数组中两元素的最大乘积的更多相关文章

  1. 【LeetCode】1464. 数组中两元素的最大乘积 Maximum Product of Two Elements in an Array (Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 找最大次大 日期 题目地址:https://le ...

  2. [LeetCode]1464. 数组中两元素的最大乘积

    给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值. 请你计算并返回该式的最大值. 示例 1: 输入:nums = [3 ...

  3. Java泛型01--任意数组中两元素交换

    package com.zl.generic; /** * 交换“任意”数组 中两个元素 */ public class GenericSwapArray { public static void m ...

  4. LeetCode 数组中两个数的最大异或值

    题目链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/ 题目大意: 略. 分析: 字典树 + 贪心. ...

  5. LeetCode 421. 数组中两个数的最大异或值(Maximum XOR of Two Numbers in an Array) 71

    421. 数组中两个数的最大异或值 421. Maximum XOR of Two Numbers in an Array 题目描述 给定一个非空数组,数组中元素为 a0, a1, a2, - , a ...

  6. Java 找到数组中两个元素相加等于指定数的所有组合

    思路1:可以用hash表来存储数组中的元素,这样我们取得一个数后,去判断sum - val 在不在数组中,如果在数组中,则找到了一对二元组,它们的和为sum,该算法的缺点就是需要用到一个hash表,增 ...

  7. 交换数组中两个元素的位置,元素包括key和value 一维数组

    /*author: yangyu@sina.cndescription: 交换数组中两个元素的位置,元素包括key和value,具体用法见下面的例子*/$arr = array(11=>'a', ...

  8. 【LeetCode每天一题】Find First and Last Position of Element in Sorted Array(找到排序数组中指定元素的开始和结束下标)

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  9. LeetCode 27 Remove Element (移除数组中指定元素)

    题目链接: https://leetcode.com/problems/remove-element/?tab=Description   Problem : 移除数组中给定target的元素,返回剩 ...

  10. Leetcode 421.数组中两数的最大异或值

    数组中两数的最大异或值 给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ...

随机推荐

  1. 【Azure Fabric Service】怎样关闭 Azure Service Fabric?

    问题描述 怎样关闭Azure Service Fabric服务呢?在Azure门户上没有找到 Stop 按钮. 问题回答 Azure Service Fabric 默认是无法停止的,可以删除. 虽然可 ...

  2. 【Azure 应用服务】Azure App Service能否使用Storage Account File Share

    问题描述 Azure App Service能否使用Storage Account File Share? 问题回答 如果部署的App Service为Linux环境,可以直接使用Mount stor ...

  3. 2023 年值得一读的技术文章 | NebulaGraph 技术社区

    在之前的产品篇,我们了解到了 NebulaGraph 内核及周边工具在 2023 年经历了什么样的变化.伴随着这些特性的变更和上线,在[文章]博客分类中,一篇篇的博文记录下了这些功能背后的设计思考和研 ...

  4. 6、mysql的SQL优化

    1. 大批量插入数据 1) 主键顺序插入 因为InnoDB类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效的提高导入数据的效率.如果InnoDB表没有主键,那么系统会自动默 ...

  5. springboot多数据源配置理解

    今天研究项目的多数据源配置,产生了一点疑惑,有很多地方没有指定数据源,那么spring如何知道连接哪一个呢?让我们从头开始梳理吧. 首先是数据源配类 其中使用到了两个数据源,项目采用读写分离,一个主库 ...

  6. Zabbix6.0使用教程 (二)—zabbix6.0常用术语

    上一次我们已经详细介绍了zabbix6.0的新增功能,本篇我们来说说zabbix6.0常用的一些术语,这个对小伙伴日常使用zabbix的时候还是非常有用,建议大家收藏起来,话不多说,附上干货. 概览 ...

  7. Nexus npm 搭建私有仓库 很好很强大 nrm electronjs

    Nexus npm 搭建私有仓库 很好很强大 https://www.jianshu.com/p/e437d8e694a0 主要想到这个包的话比较大 所以要是有个私有仓库 就方便许多 https:// ...

  8. C#中的JSON序列化方法

    在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET--NET的流行高性能JSON框架,当然也可以使用.NET自带的 System.Text.Json(.NET5).DataContra ...

  9. kubectl create 与 kubectl apply的区别

    kubectl apply和kubectl create都是Kubernetes(k8s)中用于创建或更新资源的命令,但它们在使用方式.功能和灵活性上存在一些区别. 声明式与命令式: kubectl ...

  10. ulimit.conf中soft和hard区别及常用配置

    在Linux中,ulimit命令用于限制用户对shell资源的访问,包括进程数.文件打开数等.这些限制可以分为软限制(soft limit)和硬限制(hard limit). 软限制(soft lim ...