参考部分,如有侵权,请联系删除。
题目描述
给你一个整数数组 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) = 34 = 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
方法一、排序
Java解法
class Solution {
public int maxProduct(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
return ((nums[n-1]-1)*(nums[n-2]-1));
}
}
耗时1ms
复杂度分析
时间复杂度:O(nlog(n))
空间复杂度:O(1)
方法二、比较
Java解法
参考 数组中两元素的最大乘积
class Solution {
public int maxProduct(int[] nums) {
int a = nums[0];
int b = nums[1];
for(int i=2; i<nums.length; i++){
if(a>b){
b = b > nums[i] ? b : nums[i];
} else {
a = a > nums[i] ? a : nums[i];
}
}
return (a-1) * (b-1);
}
}
耗时1ms
复杂度分析
时间复杂度:O(n),因为比较的时间复杂度是O(1),所以主要是遍历数组的时间复杂度
空间复杂度:O(1)
博主比较小白,但是热爱分享。一直感觉自己写代码的能力,算法能力都不太行,所以最近开始刷LeetCode,一方面记录方便自己学习,另一方面给需要的同伴参考。虽然失败并不可怕,但是也希望同伴们少踩一些坑。分析算法挺费劲的,留个赞或评论支持一下博主吧!同时我也非常希望写出更通俗易懂的文章,知识尚浅,如有遗漏或错误,欢迎指正~