C++ Notes
函数参数传递
1 #include<iostream>
2 using namespace std;
3 //值传递
4 void change1(int n){
5 cout<<"值传递--函数操作地址"<<&n<<endl; //显示的是拷贝的地址而不是源地址
6 n++;
7 }
8
9 //引用传递
10 void change2(int & n){
11 cout<<"引用传递--函数操作地址"<<&n<<endl;
12 n++;
13 }
14 //指针传递
15 void change3(int *n){
16 cout<<"指针传递--函数操作地址 "<<n<<endl;
17 *n=*n+1;
18 }
19 int main(){
20 int n=10;
21 cout<<"实参的地址"<<&n<<endl;
22 change1(n);
23 cout<<"after change1() n="<<n<<endl;
24 change2(n);
25 cout<<"after change2() n="<<n<<endl;
26 change3(&n);
27 cout<<"after change3() n="<<n<<endl;
28 return true;
29 }
今日题解
53. 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
解
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT_MIN;
int sizes = int(nums.size());
vector<int> qd(sizes);
result=nums[0];
qd[0]=nums[0];
for(int i =1;i<sizes;i++){
qd[i]=max(qd[i-1]+nums[i],nums[i]);
result = max(result,qd[i]);
}
return result;
}
};
思想:
动态规划:主要是求出各个阶段的最大值,在某阶段的最大值(max)与和下一个相加的数(pre)相加后,已经小于下一个相加的数(pre),可以重新开始计算新的模块。
发现一个小bug
if(nums1.size() >nums2.size()){
return intersect(nums2,nums1);
}
这里有一个小tips,我也不太懂,我从网上找了找也没找到,大概就是intersect参数先后顺序问题,如果nums1.size>nums2.size,那么在这参数里,应该是将小的放在前面,大的放在后面。
好题,动态规划
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int inf = 1e9;
int minprice = inf, maxprofit = 0;
for (int price: prices) {
maxprofit = max(maxprofit, price - minprice);
minprice = min(price, minprice);
//std::cout<<maxprofit<<","<<minprice<<std::endl;
}
return maxprofit;
}
};
在逐步往后递进的过程中,总是记录上一个阶段的最大值,在最小值刷新后(下一个阶段),再次记录最大值,如果都没有比上一阶段的最大值大的,在下一次最小值刷新再次记录最大值,体现了动态规划中,在找出每个阶段的最优解。
拆分问题,记录最优解*****