贪心算法-LeetCode 121122(深浅拷贝,贪心思路)
Posted 算法工程师之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法-LeetCode 121122(深浅拷贝,贪心思路)相关的知识,希望对你有一定的参考价值。
重磅干货,第一时间送达
作者:TeddyZhang,公众号:算法工程师之路
贪心问题:LeetCode #121 122
【深拷贝与浅拷贝】
深拷贝解决的问题是:
当创建对象时,在构造函数中建立堆区,并在析构函数中删除,当使用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
欢迎关注我的个人公众号 (算法工程师之路),公众号内有大量视频资料和电子书资料以及算法笔记,回复关键字即可获取!
号外,算法刷题二群已经建立,但由于邀请人数超出限制,无法扫码添加,可以加号主微信(Leopard7319538)说明来意,可以加入到算法刷题群,每天2道编程题3道概念题,我们一起坚持下去!!!
完
以上是关于贪心算法-LeetCode 121122(深浅拷贝,贪心思路)的主要内容,如果未能解决你的问题,请参考以下文章
函数知识点 1.包 2.hashlib模块 --- 摘要算法模块 3.logging模块 4.openpyxl模块 5.深浅拷贝 # 17