前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >贪心算法-LeetCode 121、122(深浅拷贝,贪心思路)

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

作者头像
算法工程师之路
发布2019-10-29 16:08:59
5420
发布2019-10-29 16:08:59
举报
作者:TeddyZhang,公众号:算法工程师之路

贪心问题:LeetCode #121 122

1

编程题

【深拷贝与浅拷贝】

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

复制构造的调用时机:

  • 当一个对象作为参数值传递进入函数,会拷贝出来一个临时对象
  • 当一个函数以值传递返回一个对象
  • 一个对象在声明时通过另外一个对象初始化
代码语言:javascript
复制
#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) + ];
        strcpy(buffer, str);
    }
    Test(const Test& t) {
        cout << "copy consturctor" << endl;
        buffer = new char [strlen(t.buffer) + ];
        strcpy(buffer, t.buffer);
    }
    Test& operator=(const Test& t) {
        cout << "operator=" << endl;
        buffer = new char[strlen(t.buffer) + ];
        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 ;
}

【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也需要不断的更新,最后得到最大值!

代码语言:javascript
复制
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() <= ){
            return ;
        }
        int min = prices[], max = ;
        for(int i = ;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时候买!

代码语言:javascript
复制
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int sum = ; 
        for(int i = ; 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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作者:TeddyZhang,公众号:算法工程师之路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档