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 ...
随机推荐
- 【Azure Developer】Python代码获取的Token出现'Authentication_MissingOrMalformed'问题
问题描述 Python 调用Azure AD中所注册的应用生成Token代码: import requests, json client_id = 'yourclientid' client_secr ...
- Codeforces Round 923 (Div. 3)(A~F)
目录 A B C D E F A #include <bits/stdc++.h> #define int long long #define rep(i,a,b) for(int i = ...
- Cordova下载文件,监听进度,退出疯狂报错
如题. 报错如下: W/cr_AwContents: Application attempted to call on a destroyed WebView java.lang.Throwable ...
- 春风吹又生的开源项目「GitHub 热点速览」
随着上周知名 Switch 开源模拟器 Yuzu(柚子)被任天堂起诉,该项目作者就删库了,但还是要赔偿任天堂数百万美元.此事还在 GitHub 上掀起了一波 Yuzu fork 项目的小浪潮,正所谓野 ...
- [win10] 开始-设置 / 右键-显示设置 / 右键个性化 等都不好使了。。 ms-settings:display
现象: 各种win10自带的都打不开了. 发现: 最近总是断网,重启下就好了,然后点击网络,就一直出不来.后来发现所有win10的窗口都出不来了.控制面板等等. 解决:好消息是最后解决了.坏消息是没有 ...
- 使用supervisor后台运行celery
一.先安装supervisor 1.安装命令: $ pip install supervisor 如果在沙盒环境下安装不上的话使用: $ apt-get install supervisor 二.安装 ...
- PAT 甲级考试【1003 Emergency】
题目: As an emergency rescue team leader of a city, you are given a special map of your country. The m ...
- 在Blazor中使用Chart.js快速创建图表
前言 BlazorChartjs是一个在Blazor中使用Chart.js的库(支持Blazor WebAssembly和Blazor Server两种模式),它提供了简单易用的组件来帮助开发者快速集 ...
- 《百岁人生》读书笔记 | 能活百年,为什么要死在 "35" 岁?
<百年人生>讲述了当我们如愿能够接受到 长寿 这份礼物时,它所带给我们的挑战以及应对方法,这些发生在 "眼前" 的事,不得不引发我们重新的思考.推荐阅读 一.百岁人生的 ...
- mybatis xml 文件 sql include 的用法
mybatis xml 文件中对于重复出现的sql 片段可以使用标签提取出来,在使用的地方使用标签引用即可具体用法如下: <sql id="Base_Column_List" ...