拼多多内推笔试一:求数组中任意三个数的最大乘积
来源:互联网 发布:佛教电影知乎 编辑:程序博客网 时间:2024/04/27 15:00
这是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
阅读全文
0 0
- 拼多多内推笔试一:求数组中任意三个数的最大乘积
- 拼多多笔试题一:给出一个无序整数数组,求任意三个数的最大乘积
- 拼多多算法工程师笔试题之求解一维无序数组中三个数字乘积最大值(正负零均存在)
- 2018拼多多内推笔试记录
- 求无序数组中的三个数的最大乘积
- 笔试题 找到数组中,三个数乘积最大的结果
- 从数组中找出乘积最大的三个数
- 无序数组中,三个数的乘积最大
- 2017.8.1拼多多内推内推笔试题(1)—最大乘积的求取(分治求K大(小))
- 笔试题:求最大连续子数组的最大乘积
- 求数组中任意n-1个元素的最大乘积
- 拼多多-最大乘积-c/c++
- 求数组内任意三个数相加和为零的组合
- 求解无序数组中三个数的最大乘积 (python实现)
- 求三个数中最大的数
- n-1 个数中三个数乘积最大的最小公倍数
- 拼多多内推编程题
- 拼多多内推笔试二:数字字符串两个字符串相乘/大数相乘
- jQuery技术详解
- LeetCode 83 Remove Duplicates from Sorted List
- maven中的web.xml
- 【十大经典数据挖掘算法】C4.5
- 正态分布的一些事儿
- 拼多多内推笔试一:求数组中任意三个数的最大乘积
- Maven入门指南⑦:Maven的生命周期和插件
- Android RecyclerView <一> 纯粹
- Rikka with Graph||HDU5631
- PDF编辑之加密的PDF文档如何解除密码和进行编辑
- 基于已有项目整合webpack配合babel支持es6转码压缩
- hadoop fs -put 上传文件遇到错误2 hadoop fs -put /opt/exercise/ds.txt ds.txt
- 独立实现字符串转Integer
- php学习笔记