一、题目信息
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。
请你计算并返回该式的最大值。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-of-two-elements-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
输入: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.length <= 500
1 <= nums[i] <= 10^3
二、解题
解析
方法1:两层for循环,算出所有组合的乘积,从而算出最大值,时间复杂度:O(n²)
方法2:使用冒泡排序循环两次找出数组中最大的两个数相乘即为最大值,时间复杂度:O(n)
代码
// 方法1:两层for循环:O(n²)
class Solution {
public int maxProduct(int[] nums) {
int max = 1;
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
max = (nums[i]-1) * (nums[j]-1) > max?(nums[i]-1) * (nums[j]-1):max;
}
}
return max;
}
}
// 方法2:循环两次冒泡排序:O(n)
class Solution {
public int maxProduct(int[] nums) {
int max = 1;
for (int i = 0; i < 2; i++) {
for(int j = nums.length - 1 ; j > i; j--) {
if (nums[j] > nums[j-1]) {
nums[j] = nums[j]^nums[j-1];
nums[j-1] = nums[j]^nums[j-1];
nums[j] = nums[j]^nums[j-1];
}
}
}
return (nums[0]-1)*(nums[1]-1);
}
}