原题如下:
第一次想法:运用循环嵌套将数组中元素两两相乘求初最大值。
代码如下:
int maxProduct(int* nums, int numsSize){
int i, j, sum, sum1 = 0;
for (i = 0;i < numsSize;i++) {
for(j = i + 1; j < numsSize; j++) { //j = i + 1为了防止i,为相同位置的数。
sum = (nums[i]-1)*(nums[j]-1);
if (sum > sum1) {
sum1 = sum;
}
}
}
return sum1;
}
缺点:由于该程序是两个循环嵌套而成时间复杂度O(n^2),运行效率较低。
优化:通过分析题目只要找到数组中最大和而第二大的数即可算出最大的结果。
代码如下:
int maxProduct(int* nums, int numsSize){
if (numsSize == 2) return (nums[0]-1)*(nums[1]-1);
int max1, max2, i; //max1为最大的数,max2为第二大的数
max1 = nums[0] > nums[1] ? nums[0] : nums[1];
max2 = nums[0] > nums[1] ? nums[1] : nums[0];
for(i = 2;i < numsSize;i++) {
if(max1 < nums[i]) {
max2 = max1;
max1 = nums[i];
}
else if (max1 >= nums[i] && max2 < nums[i]) {
max2 = nums[i];
}
//防止数组最大的数在前面导致无法找出真正的第二大
//eg:[1,2,9,3,6,5,4] 若无else if 当max1 = 9时max2一直保持6
}
return (max1 - 1) * (max2 -1);
}
这个算法的时间复杂度为O(n),相比于上一个方法更加优化了。
summary:注意审题找出解题关键,多思考几种做法。