zoukankan      html  css  js  c++  java
  • 《剑指offer》第六十三题(股票的最大利润)

    // 面试题63:股票的最大利润
    // 题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股
    // 票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5,
    // 7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能
    // 收获最大的利润11。
    
    #include <iostream>
    //如果从头到尾遍历所有的数对,时间复杂度O(n^2),显然不够好
    //若固定一个值,直接找前面的最小值,这样更好
    
    int MaxDiff(const int* numbers, unsigned length)
    {
        if (numbers == nullptr && length < 2)//边界判断
            return 0;
    
        int min = numbers[0];//记住当前值前的数组的最小值,初始化为第一个数
        int maxDiff = numbers[1] - min;//记住遍历的每个数与它之前最小值之间的差的最大值
    
        for (int i = 2; i < length; ++i)//遍历每个数
        {
            if (numbers[i - 1] < min)//对变量min,检测是否是当前数组最小值
                min = numbers[i - 1];
    
            int currentDiff = numbers[i] - min;//计算当前利润
            if (currentDiff > maxDiff)
                maxDiff = currentDiff;//更新maxDiff
        }
    
        return maxDiff;
    }
    
    // ==================== Test Code ====================
    void Test(const char* testName, const int* numbers, unsigned int length, int expected)
    {
        if (testName != nullptr)
            printf("%s begins: ", testName);
    
        if (MaxDiff(numbers, length) == expected)
            printf("Passed.
    ");
        else
            printf("FAILED.
    ");
    }
    
    void Test1()
    {
        int numbers[] = { 4, 1, 3, 2, 5 };
        Test("Test1", numbers, sizeof(numbers) / sizeof(int), 4);
    }
    
    // 价格递增
    void Test2()
    {
        int numbers[] = { 1, 2, 4, 7, 11, 16 };
        Test("Test2", numbers, sizeof(numbers) / sizeof(int), 15);
    }
    
    // 价格递减
    void Test3()
    {
        int numbers[] = { 16, 11, 7, 4, 2, 1 };
        Test("Test3", numbers, sizeof(numbers) / sizeof(int), -1);
    }
    
    // 价格全部相同
    void Test4()
    {
        int numbers[] = { 16, 16, 16, 16, 16 };
        Test("Test4", numbers, sizeof(numbers) / sizeof(int), 0);
    }
    
    void Test5()
    {
        int numbers[] = { 9, 11, 5, 7, 16, 1, 4, 2 };
        Test("Test5", numbers, sizeof(numbers) / sizeof(int), 11);
    }
    
    void Test6()
    {
        int numbers[] = { 2, 4 };
        Test("Test6", numbers, sizeof(numbers) / sizeof(int), 2);
    }
    
    void Test7()
    {
        int numbers[] = { 4, 2 };
        Test("Test7", numbers, sizeof(numbers) / sizeof(int), -2);
    }
    
    void Test8()
    {
        Test("Test8", nullptr, 0, 0);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        Test7();
        Test8();
        system("pause");
        return 0;
    }
  • 相关阅读:
    Swift
    ios中沙盒
    Mac下安装apk(命令形式)
    iOS 保存异常日志
    android sliding menu
    iOS 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
    iOS应用崩溃日志分析
    iOS 推送
    iOS 修改textholder的颜色
    iOS 7.1 UITapGestureRecognizer 不好用的解决办法
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10547580.html
Copyright © 2011-2022 走看看