给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

    1. 输入:nums = [1,2,3]
    2. 输出:6

    方法一:先对数组进行排序,然后判断最大值为两个负数一个正数相乘还是三个正数相乘两种情况,返回最大值

    时间复杂度:O(N\log N)O(NlogN),其中 NN 为数组长度。排序需要 O(N\log N)O(NlogN) 的时间。
    空间复杂度:O(\log N)O(logN),主要为排序的空间开销。

    1. var maximumProduct = function(nums) {
    2. nums.sort((a,b)=>a-b)
    3. return Math.max(nums[nums.length-1]*nums[nums.length-2]*nums[nums.length-3],nums[0]*nums[1]*nums[nums.length-1])
    4. };

    方法二:线性扫描
    通过五个指针,max1,2,3 min1,2 判断最大的三个数和最小的两个数,然后比较最大三个数的乘积和最小的两个数乘最大的一个数的乘积的大小,返回最大的值

    时间复杂度:O(n)
    空间复杂度:O(n)

    1. var maximumProduct = function(nums) {
    2. nums.sort((a,b)=>a-b)
    3. return Math.max(nums[nums.length-1]*nums[nums.length-2]*nums[nums.length-3],nums[0]*nums[1]*nums[nums.length-1])
    4. };
    1. var maximumProduct = function (nums) {
    2. let max1 = max2 = max3 = -Infinity;
    3. let min1 = min2 =Infinity;
    4. for (let i = 0; i < nums.length; i++) {
    5. let num = nums[i];
    6. if(num>max1){
    7. max3 = max2;
    8. max2 = max1;
    9. max1 = num;
    10. }else if(num>max2){
    11. max3 = max2;
    12. max2 = num;
    13. }else if(num>max3){
    14. max3 = num;
    15. }
    16. if(num<min1){
    17. min2 = min1;
    18. min1 = num;
    19. }else if(num<min2){
    20. min2 = num
    21. }
    22. }
    23. return Math.max(max1*max2*max3,min1*min2*max1)
    24. };