贪心算法-LeetCode 121122(深浅拷贝,贪心思路)

Posted 算法工程师之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法-LeetCode 121122(深浅拷贝,贪心思路)相关的知识,希望对你有一定的参考价值。


重磅干货,第一时间送达

作者:TeddyZhang,公众号:算法工程师之路

贪心问题:LeetCode #121 122

1
编程题

【深拷贝与浅拷贝】

深拷贝解决的问题是:
当创建对象时,在构造函数中建立堆区,并在析构函数中删除,当使用Test t2 = t1时,这属于浅拷贝,此时t2和t1的buffer指向同一区域,只是指针不同!
但是当main函数结束后,程序退出,这两个对象都会调用自己的析构函数对buffer指向的内存进行释放,但问题是:会出现两次delete,同一块内存不可以释放两次,否则程序崩溃!
因此需要使用深拷贝,由于Test t2 = t1运行过程中会调用复制构造函数!从而在复制构造中重新开辟一块区域,实现深拷贝!
当我们解决了Test t2 = t1的问题,会发现t3 = t1的赋值运算也是浅拷贝!如何解决呢?重载赋值运算符即可

复制构造的调用时机:

  • 当一个对象作为参数值传递进入函数,会拷贝出来一个临时对象

  • 当一个函数以值传递返回一个对象

  • 一个对象在声明时通过另外一个对象初始化


#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;

class Test {
public:
    char* buffer = NULL;
    Test(){}
    Test(char* str) {
        buffer = new char[strlen(str) + 1];
        strcpy(buffer, str);
    }
    Test(const Test& t) {
        cout << "copy consturctor" << endl;
        buffer = new char [strlen(t.buffer) + 1];
        strcpy(buffer, t.buffer);
    }
    Test& operator=(const Test& t) {
        cout << "operator=" << endl;
        buffer = new char[strlen(t.buffer) + 1];
        strcpy(buffer, t.buffer);
        return *this;
    }
    ~Test() {
        if (buffer != NULL) {
            delete buffer;
            buffer = NULL;
        }
    }
};

int main() {
    char a[] = "Hello";
    char* b = a;
    Test t1(b);
    Test t2 = t1;   // 调用复制拷贝构造函数
    Test t3;
    t3 = t1;        // 重载等号运算符
    cout << (t1.buffer == t2.buffer) << endl;

    system("PAUSE");
    return 0;
}

【LeetCode #121】买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
   注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

算法原理:

主要思想是遍历整个prices数组,当遍历到 i 时,需要存取 i 之前的数中的最小值,然后使用当前价格prices[i] - min最小值,取最大的即可!
注意遍历时,min不断的更新,因此prices[i] - min也需要不断的更新,最后得到最大值!

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() <= 1){
            return 0;
        }
        int min = prices[0], max = 0;
        for(int i = 0;i < prices.size(); i++){
            max = (max < prices[i] - min) ? (prices[i] - min) : max;
            min = (min < prices[i]) ? min : prices[i];
        }
        return max;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock

【LeetCode #122】买卖股票的最佳时机 II

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
   随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

算法原理:

这道题目就没有什么好说了,如果第二天比第一天价格高,那就当天买,次天抛售,利润一定最高!这是一种贪心思路。
为什么这种贪心思路可以成立呢?我们可以假设一种反例情况【5 2 100】,如果在5时候买,只能等到100再售出,那还不如在2时候买!

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int sum = 0
        for(int i = 1; i < prices.size(); i++){
            if(prices[i] > prices[i-1]){
                sum += (prices[i] - prices[i-1]);
            }
        }
        return sum;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii

2
资源分享


欢迎关注我的个人公众号 (算法工程师之路),公众号内有大量视频资料和电子书资料以及算法笔记,回复关键字即可获取!

号外,算法刷题二群已经建立,但由于邀请人数超出限制,无法扫码添加,可以加号主微信(Leopard7319538)说明来意,可以加入到算法刷题群,每天2道编程题3道概念题,我们一起坚持下去!!!

贪心算法-LeetCode 121、122(深浅拷贝,贪心思路)


更多精彩推荐,请关注我们
在看点这里

以上是关于贪心算法-LeetCode 121122(深浅拷贝,贪心思路)的主要内容,如果未能解决你的问题,请参考以下文章

关于Java中的HashMap的深浅拷贝的测试与几点思考

函数知识点 1.包 2.hashlib模块 --- 摘要算法模块 3.logging模块 4.openpyxl模块 5.深浅拷贝 # 17

贪心算法问题-LeetCode 5545(贪心算法,跳跃问题)

leetcode之贪心算法刷题总结3

leetcode之贪心算法刷题总结2

leetcode之贪心算法刷题总结4