拼多多内推笔试一:求数组中任意三个数的最大乘积

这是leetcode上的的原题
https://leetcode.com/problems/maximum-product-of-three-numbers/description/
因为数组中可能有正数、负数和0,所以解题思路是:找出最小的两个负数和最大的正数相乘 以及三个最大的正数相乘 ,两者取其中最大值。
1、原leetcode中的解题代码:

class Solution {
public:
    int maximumProduct(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int len=nums.size();
        return max(nums[0]*nums[1]*nums[len-1],nums[len-3]*nums[len-2]*nums[len-1]);     
    }
};

2、针对这次笔试的牛客网上的代码:
要求时间复杂度O(n), 空间复杂度O(1)。分治法
其实就是使用了5次快速排序中的partition函数,找到符合位置的那5个数,所以时间复杂度从O(nlogn)变成了O(n)

#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
long long a[N];
int k;

int partition(int l,int r) {
    while(l != r)
    {
        while(a[r] >= a[l] && r > l)
            r--;
        if(l == r)
            break;
        swap(a[r],a[l]);
        while(a[l] < a[r] && r > l)
            l++;
        if(l < r)
            swap(a[r],a[l]);

    }
    return l;
}

long long solve(int l,int r) {
    int now = partition(l,r);
    if(k < now)
        return solve(l,now-1);
    else if(k > now)
        return solve(now+1,r);
    else
        return a[now];
}


int main() {
    int n;
    while(~scanf("%d", &n)) {
        for(int i = 0; i < n; ++i) {
            scanf("%lld", &a[i]);
        }

        k = n - 1;
        long long x1 = solve(0, n-1);
        k = n - 2;
        long long x2 = solve(0, n-2);
        k = n - 3;
        long long x3 = solve(0, n-3);
        long long Ans = x1 * x2 * x3;
        if(n > 3) {
            k = 0;
            long long y1 = solve(0, n-1);
            k = 1;
            long long y2 = solve(0, n-2);
            Ans = max(Ans, y1*y2*x1);
        }
        printf("%lld\n", Ans);
    }
    return 0;
}

参考链接:
http://tieba.baidu.com/p/5099192704
牛客上的牛人解答:
https://www.nowcoder.com/discuss/30697?type=0&order=0&pos=17&page=2
https://www.nowcoder.com/discuss/30693?type=0&order=0&pos=25&page=1

发布了31 篇原创文章 · 获赞 41 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/circle2015/article/details/76588029