Day2 -实习刷题打卡

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;
}

};

在逐步往后递进的过程中,总是记录上一个阶段的最大值,在最小值刷新后(下一个阶段),再次记录最大值,如果都没有比上一阶段的最大值大的,在下一次最小值刷新再次记录最大值,体现了动态规划中,在找出每个阶段的最优解。
拆分问题,记录最优解*****

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务