https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Mock%20Interviews/Ride%20Share%20Start-Up%20Company/Ride%20Share%20Company%20-%20Interview%20Questions%20-%20SOLUTIONS/On-Site%20Question%201%20-%20SOLUTION.ipynb

On-Site Question 1 - SOLUTION

Problem

Given a list of integers, find the largest product you could make from 3 integers in the list

Requirements

You can assume that the list will always have at least 3 integers

Paper/pencil only, don't code this out until you've solved it as far as you can by hand.

 

Solution

We can solve this problem in O(n) time with O(1) space, we should also be able to take into account negative numbers, so that a list like: [-5,-5,1,3] returns (-5)(-5)(3) = 75 as its answer.

Hopefully you've begun to realize the similarity between this problem and the Amazon stock problem from the E-Commerce Company mock interview questions! You could brute force this problem by just simply trying every single combination of three digits, but this would require O(n^3) time!

How about we use a greedy approach and keep track of some numbers. In the stock problem we kept track of max profit so far, in this problem we are actually going to keep track of several numbers:

  • The highest product of 3 numbers so far
  • The highest product of 2 numbers so far
  • The highest number so far

Since we want to keep negative numbers in account, we will also keep track of the lowest product of two and the lowest number:

  • The lowest product of 2
  • The lowest number

Once we iterate through the list and reach the end we will have the highest posiible product with 3 numbers. At each iteration we will take the current highest product of 3 and compare it to the current integer multiplied by the highest and lowest products of 2.

Let's see this coded out:

 
 
 
def solution(lst):

    # Start at index 2 (3rd element) and assign highest and lowest
# based off of first two elements # Highest Number so far
high = max(lst[0],lst[1]) # Lowest number so far
low = min(lst[0],lst[1]) # Initiate Highest and lowest products of two numbers
high_prod2 = lst[0]*lst[1]
low_prod2 = lst[0]*lst[1] # Initiate highest product of 3 numbers
high_prod3 = lst[0]*lst[1]*lst[2] # Iterate through list
for num in lst[2:]: # Compare possible highest product of 3 numbers
high_prod3 = max(high_prod3,num*high_prod2,num*low_prod2) # Check for possible new highest products of 2 numbers
high_prod2 = max(high_prod2,num*high,num*low) # Check for possible new lowest products of 2 numbers
low_prod2 = min(low_prod2,num*high,num*low) # Check for new possible high
high = max(high,num) # Check for new possible low
low = min(low,num) return high_prod3
 
 
 
In [5]:
l = [99,-82,82,40,75,-24,39, -82, 5, 30, -25, -94, 93, -23, 48, 50, 49,-81,41,63]

solution(l)
Out[5]:
763092
 

Great! Through the use of a greedy approach we have been able to complete the problem in O(n) time. Keep this sort of approach in mind when you have to iterate through a list and a brute force solution is on the order of an exponential!

Good Job!

Largest product from 3 integers的更多相关文章

  1. projecteuler Problem 8 Largest product in a series

    The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = ...

  2. Largest product in a grid

    这个比前面的要复杂点,但找对了规律,还是可以的. 我逻辑思维不强,只好画图来数数列的下标了. 分四次计算,存入最大值. 左右一次,上下一次,左斜一次,右斜一次. In the 2020 grid be ...

  3. Largest product in a series

    这个我开始理解错了,算错了. 我以为是求连续5个数的最大值,结果,是连接5个数相乘的最大值. 英语不好,容易吃亏啊. Find the greatest product of five consecu ...

  4. R语言学习——欧拉计划(11)Largest product in a grid

    Problem 11 In the 20×20 grid below, four numbers along a diagonal line have been marked in red. 08 0 ...

  5. 【Project Euler 8】Largest product in a series

    题目要求是: The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × ...

  6. Problem 8: Largest product in a series

    先粘实现代码,以后需要再慢慢补充思路 s = ''' 73167176531330624919225119674426574742355349194934 9698352031277450632623 ...

  7. Project Euler 11 Largest product in a grid

    题意:在这个20×20方阵中,四个在同一方向(从下至上.从上至下.从右至左.从左至右或者对角线)上相邻的数的乘积最大是多少? 思路:暴力去枚举以 ( x , y ) 为中心拓展的四个方向 /***** ...

  8. Project Euler 8 Largest product in a series

    题意:寻找这 1000 个数中相邻 13 个数相乘积最大的值 思路:首先想到的是暴力,但是还可以利用之前记录过的数值,什么意思呢?即在计算 2 - 14 后,再计算 3 - 15 时完全可以利用之前计 ...

  9. Maximum Product Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

随机推荐

  1. sed 小结

    语法格式1: sed option command file 注意区分 option command, option 以-开始 command 以单?引号包围 ———— 这完全是误会, 我测试好多后发 ...

  2. CentOs - 使用ssh key远程登录

    环境: 服务器端CentOs,本地OS X 服务器端: 1. 安装openssl使实现ssl协议 2. 将本地的pub key加入信任列表 本地: 1. 生成pub key 2. 配置ssh别名使登陆 ...

  3. linux获取日志指定行数范围内的内容

    假如我要获取“浅浅岁月拂满爱人袖”到“落入凡尘伤情着我”之间的内容. 1.首先得到他们所在的行号: -n选项显示行号 但是有时候grep后显示的是“匹配到二进制文件(标准输入)”,说明搜索的字符串在某 ...

  4. Struts2:No result defined for action com.yibai.user.action.LoginAction and result input

    转自:https://zhidao.baidu.com/question/133574016.html 1 String 里面有5个static 常量分别是: ERROR INPUT LOGIN NO ...

  5. 使用jquery.more.js来实现点击底部更多后, 底部加载出新的数据

    <div class="bus-nav-bar ft12"> <div class="navt bor-r-c pos-rel {if $int == ...

  6. 返回顶部 fixed oncheck(点击按钮)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. ubuntu 命令安装软件

    终端安装(命令安装).第一,找到终端或者按住Ctrl+Alt+t 打开终端;第二输入命令,命令如下:cd /xxx/xxx/,(xxx代表软件包路径,一直到你放置软件包的文件夹),之后输入命令:sud ...

  8. 尴尬!Jsp内置对象

    今天挺尴尬的,上网络安全课做错了ppt ,尴尬到头皮发麻. JSP内置对象 JSP内置对象是Web容器创建的一组对象,不使用new关就可以使用的内置对象. <%int[ ]value= {60, ...

  9. HTML5 historyState pushState、replaceState

    DOM中的window对象通过window.history方法提供了对浏览器历史记录的读取,让你可以在用户的访问记录中前进和后退. 从HTML5开始,我们可以开始操作这个历史记录堆栈. 1.Histo ...

  10. 两台Linux之间传文件

    安装sudo apt-get install openssh-client openssh-server 使用scp命令: scp john@~/hallo.h /usr/include 将左边移动到 ...