628. 三个数的最大乘积

#628.三个数的最大乘积

题目描述
628. 三个数的最大乘积_第1张图片
解题思路
1、无技术含量法
这道题应该是很简单的,最简单的方法就是先对数组进行排序,然后比较得到最大值。

public int maximumProduct(int[] nums) {        
	int max = nums.length - 1;         
	Arrays.sort(nums);        
	return Math.max(nums[0]*nums[1]*nums[max],nums[max]*nums[max-1]*nums[max-2]);
    }

复杂度分析
时间复杂度:O(NlogN),其中 N 是数组的长度。
空间复杂度:O(logN),为排序使用的空间。

2、线性扫描法
实际上不需要对整个数组进行排序,只需要最大三个数,所以可以用一次线性扫描同时获得最大数,还是比较好懂的。值得注意的就是max和min初始值的设定,试验发现如果设置成0或者数组第一个数都会在某些情况下存在一些问题。代码里的设置是最稳妥的方式,学习了!

public int maximumProduct(int[] nums) {        
	int max1,max2,max3,min1,min2;         
	max1 = max2 = max3 =Integer.MIN_VALUE;         
	min1 = min2 = Integer.MAX_VALUE;         
	for (int n:nums) {             
		if (n < min1) {  //如果当前小于最小值min1,交换两个位置
		min2 = min1;                
		min1 = n;            
	}             
	else if (n < min2) {                
		min2 = n;            
		}
		
        if (n > max1) {  //如果当前比最大的max1还要大,则交换三个数的位置
        	max3 = max2;                
        	max2 = max1;                
        	max1 = n;            
        	}            
        else if (n > max2) {  //如果当前数介于max1和max2之间                
        	max3 = max2;                
        	max2 = n;            
       		}            
        else if(n > max3) {                
        	max3 = n;            
        	}        
        }         
        return Math.max(min1*min2*max1, max1*max2*max3);
    }

复杂度分析
时间复杂度:只要遍历一次数组,O(N)。
空间复杂度:O(1)。

你可能感兴趣的:(力扣刷题笔记)