求无序数组最大差值

  hulu的一道面试题,比如你预先知道股票的每天的股价,让你算出哪一天买入 哪一天卖出赚的最多。

  这个可以变形为找出一个无序数组中后面的数减去前面的数的最大值。

  简单粗暴的解法就是遍历了 复杂度O(n^2)

  这其实是个很典型的DP问题,复杂度O(n)。

转换公式是这样的:

S0 = 0

Sn =  T> 0 ? T: 0  (Tn = an -  an-1 + Sn-1)

伪代码:

MinIdx = 0
MaxIdx = 0
S[0] = 0
MaxR = INTMIN

FOR i IN (1->n) :
DO
     tmp = A[i] - A[i-1] + S[i-1]
     IF tmp > 0 :
         S[i] = tmp
         IF S[i] > MaxR:
             MaxIdx = i
             MaxR = S[i]
         FI
     ELSE :
         S[i] = 0
         MinIdx = i
     FI
DONE

PRINT MinIdx,MaxIdx,MaxR        
时间: 2024-10-24 10:33:53

求无序数组最大差值的相关文章

笔试算法题(22):二分法求旋转数组最小值 & 骰子值概率

出题:将一个数组最开始的k个(K小于数组大小N)元素照搬到数组末尾,我们称之为数组的旋转:现在有一个已经排序的数组的一个旋转,要求输出旋转数组中的最小元素,且时间复杂度小于O(N): 分析: 时间复杂度小于O(N)也就是不能用常规的遍历思路:可以将数组看成两个都是递增序列(假设为升序)的子数组,并且前半段的元素均大于等于后半段的元素,分界点的位于后半段数组的第一个元素就是最小元素: 具体算法:两个指针left和right指向数组第一个和最后一个元素,使用Binary Search确定中间元素mi

求无序数组的中位数

中位数即是排过序后的处于数组最中间的元素. 不考虑数组长度为偶数的情况.设集合元素个数为n. 简单的想了下:思路1) 把无序数组排好序,取出中间的元素            时间复杂度 采用普通的比较排序法 O(N*logN)            如果采用非比较的计数排序等方法, 时间复杂度 O(N), 空间复杂度也是O(N). 思路2)           2.1)将前(n+1)/2个元素调整为一个小顶堆,          2.2)对后续的每一个元素,和堆顶比较,如果小于等于堆顶,丢弃之,

数组最大差值的最优解法(动态规划)

最近在公司要计算一下我们所有用户中年纪最大与最小的相差多少岁以统计公司用户年龄层. 我们公司的客户是数量很大,所以普通的排序求差值或者快排算法其实很难满足要求. 一个简单的排序算法求解如下: def stepIn(dataInput) dataLen = dataInput.length diff = nil dataResule = {} for i in 0...dataLen-1 for n in i+1...dataLen diff2 = dataInput[n] - dataInput

【桶排序】求无序数组中最大的“Gap"

题目:leetcode Given an unsorted array, find the maximum difference between the successive elements in its sorted form. Try to solve it in linear time/space. Return 0 if the array contains less than 2 elements. You may assume all elements in the array a

求无序数组中未出现的最小正整数

给定一个无序整型数组arr,找到数组中未出现的最小正整数.要求时间复杂度为O(N),空间复杂度为常数级. 例如: arr=[33,33,33,33]  返回1 arr=[34,56,45,12]  返回1 arr=[-1,2,3,4]  返回1 arr=[1,2,3,4]   返回5 ... 随便什么都行 原理很简单,代码用数据跑一遍就看出思想了. 1 #include<iostream> 2 #include<fstream> 3 using namespace std; 4 i

给一个整形数组,给出一个值,当这个值是数组某些数字的和,求出数组下标的值

Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that

在O(n)时间复杂度内求无序数组中任意两个元素的最大差值,以及存在的组数

题目描述: 求无序数组中任意两个元素的最大差值,以及存在最大差值的组别数. 输入: 输入包含两行,第一行输入一个整数n:第二行n个正整数,用空格隔开. 输出: 输出为一行,包含最大差值,以及存在组别数. 样例输入: 4 4  1  2  1 输出: 3  2 一种实现代码如下(Java版): 1 import java.util.Scanner; 2 /** 3 * 在O(n)时间复杂度内求无序数组中任意两个元素的最大差值,以及存在的组数 4 * @author JiaJoa 5 * 6 */

求一无序数组中第n大的数字 - 快速选择算法

逛别人博客的时候,偶然看到这一算法题,顺便用C++实现了一下. 最朴素的解法就是先对数组进行排序,返回第n个数即可.. 下面代码中用的是快速选择算法(不晓得这名字对不对) 1 #include <vector> 2 #include <iostream> 3 #include <stdexcept> 4 #include <cstdio> 5 6 const int QS_EERRMSG_LEN = 256; 7 8 9 /** 10 * 快速选择求无序数组

算法题:找出一个数组中相加值最大的连续序列元素

package arithmetic; /** * @author SHI * 求一个数组中相加值最大的连续序列元素 */ public class MaxSequence { public static void main(String[] args) { int[] a=new int[]{-2,9,-3,4,-6,7,-6,4}; findBigSequence(a); } /** * 思想: (1)计算出该数组的所有元素和,假设该值为最大 * (2)从数组下标1到a.length-1依次