leetcode-数组中两元素的最大乘积
题目描述
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (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
题目分析
从描述中可以得出以下几个解题关键信息:
- 同一个数组,但下标不同的两个数
- 从所有结果中取最大值,即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-数组中两元素的最大乘积的更多相关文章
- 【LeetCode】1464. 数组中两元素的最大乘积 Maximum Product of Two Elements in an Array (Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 找最大次大 日期 题目地址:https://le ...
- [LeetCode]1464. 数组中两元素的最大乘积
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值. 请你计算并返回该式的最大值. 示例 1: 输入:nums = [3 ...
- Java泛型01--任意数组中两元素交换
package com.zl.generic; /** * 交换“任意”数组 中两个元素 */ public class GenericSwapArray { public static void m ...
- LeetCode 数组中两个数的最大异或值
题目链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/ 题目大意: 略. 分析: 字典树 + 贪心. ...
- 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 ...
- Java 找到数组中两个元素相加等于指定数的所有组合
思路1:可以用hash表来存储数组中的元素,这样我们取得一个数后,去判断sum - val 在不在数组中,如果在数组中,则找到了一对二元组,它们的和为sum,该算法的缺点就是需要用到一个hash表,增 ...
- 交换数组中两个元素的位置,元素包括key和value 一维数组
/*author: yangyu@sina.cndescription: 交换数组中两个元素的位置,元素包括key和value,具体用法见下面的例子*/$arr = array(11=>'a', ...
- 【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 ...
- LeetCode 27 Remove Element (移除数组中指定元素)
题目链接: https://leetcode.com/problems/remove-element/?tab=Description Problem : 移除数组中给定target的元素,返回剩 ...
- Leetcode 421.数组中两数的最大异或值
数组中两数的最大异或值 给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 . 找到 ai 和aj 最大的异或 (XOR) 运算结果,其中0 ...
随机推荐
- 5分钟教你从爬虫到数据处理到图形化一个界面实现山西理科分数查学校-Python
5分钟教你从爬虫到数据处理到图形化一个界面实现山西理科分数查学校-Python 引言 在高考结束后,学生们面临的一大挑战是如何根据自己的分数找到合适的大学.这是一个挑战性的任务,因为它涉及大量的数据和 ...
- Android系统瘦身
文件格式: Windows常见的文件系统是FAT16.FAT32,NTFS,在Windows环境提供了分区格式转换工具,可以在DOC环境下 使用 Convert命令(Convert e:/fs:nt ...
- TLS原理与实践(四)国密TLS
主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 引言 TLS作为保证网络通信安全的关键技术和基石被广泛应用,但目前主流 ...
- Prompt进阶2:LangGPT(构建高性能Prompt策略和技巧)--最佳实践指南
Prompt进阶2:LangGPT(构建高性能Prompt策略和技巧)--最佳实践指南 0.前言 左图右图 prompt 基本是一样的,差别只在提示工程这个词是否用中英文表达.我们看到,一词之差,回答 ...
- WEBRTC回声消除-AECM算法源码解析之参数解析
一 概述 webrtc 针对回声问题一共开源了3种回声消除算法,分别为aec,aecm,以及aec3,其中aec是最早期的版本,在后续的更新中aec3的出现代替了aec在webrtc 中的地位,而 ...
- Web Audio API 第1章 基础篇
Web Audio API 第1章 基础篇 我查了一下 Web Audio API 蝙蝠书居然在 2013 年就出版了 我又看了一下我的"豆瓣读书"频道内,这本书加入到" ...
- c语言之被遗漏的角落---#pragma pack
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 游戏引擎中的实时渲染和在V-Ray中渲染有什么区别 2022-11-25
游戏引擎中的实时渲染和在V-Ray中渲染有什么区别,下面我们一起来分析一下,从2个方面来具体分析实时渲染和在V-Ray中渲染种的不一样的区别. 原理区别 VRay等渲染器原理上叫做离线渲染(Offli ...
- JavaScript自定义响应式对象
1. 引言 这里的响应式对象是指JavaScript中的变量与HTML中的内容相绑定,变量更新则内容更新,也叫数据绑定 此时不得不说MVVM架构,MVVM架构思想的实现步骤如下: 模型(Model): ...
- 记一次 .NET某游戏后端API服务 CPU爆高分析
一:背景 1. 讲故事 前几天有位朋友找到我,说他们的API服务程序跑着跑着CPU满了降不下去,让我帮忙看下怎么回事,现在貌似民间只有我一个人专注dump分析,还是申明一下我dump分析是免费的,如果 ...