LeetCode算法题个人笔记【数组】【简单6-10】【c++】

**

第六题:还是杨辉三角

**

和 118 题 一样,依旧是杨辉三角。区别在于之前是输出所有层的数,这道题只需要输出第 k 层的数。

意思是说,我们只用一行vector< int> 就行,不断更新这一个,(1 )->( 1,1) ->(1,2,1)因为根据上一题我们可以知道反正都是根据上一行得到当前行,动态规划对吧。

且注意这题条件有所不同

输入: 3
输出: [1,3,3,1]

这里的rowIndex不是指行数,而是指索引

LeetCode算法题个人笔记【数组】【简单6-10】【c++】_第1张图片

class Solution {
   
public:    
	vector<int> getRow(int rowIndex)    
	{
           
		vector<int> result;        
		for(int i=0;i<=rowIndex;i++)        
		{
               
			result.push_back(1);            
			for(int j=i-1;j>0;j--)//从后往前,从倒数第二个(i-1)到第二个(1)            
			{
                   
				result[j]+=result[j-1];            
			}        
		}        
		return result;    
	}
};

高,实在是高

方法二:数学法

0!=1,n!=(n-1)!×n。

LeetCode算法题个人笔记【数组】【简单6-10】【c++】_第2张图片

LeetCode算法题个人笔记【数组】【简单6-10】【c++】_第3张图片

Cnk​=n!/(k!(n−k)! ) = ((n−k+1)* (n-k) *…(n-2)(n-1)(n))/k!

举例rowIndex=3;很容易理解

class Solution {
   
public:    
	vector<int> getRow(int rowIndex)    
	{
           
		vector<int> ans;        
		int n=rowIndex;        
		for(int k=0;k<=n;k++)        
		{
               
			ans.push_back(Combination(n,k));        
		}        
		return ans;    
	}
        int Combination(int n,int k)    
        {
           
        	long result=1;//细        
        	for(int i=1;i<=k;i++)//阶乘,1到k,不久是!k呗        
        	{
               
        		result=result*(n-k+i)/i;        
        	}        
        	return (int)result;    
        }
};

**

第七题:买卖股票的最佳时机

**

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。

注意:你不能在买入股票前卖出股票。

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

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

似乎有点类似之前的最长公共子串,确实这题同样有个解法是动态规划

评论区:

动态规划 前i天的最大收益 = max{前i-1天的最大收益,第i天的价格-前i-1天中的最小价格}
同时随时间更新最小价格
存在只有一天的情况,此时利润为0

DP (dynamic programming)
DP的思路: 利用原问题与子问题的关系,将其变成 大问题的解 = 小问题的解的函数, 从而将问题变成size的扩展即可,当size到达最大后,原问题解决了

暴力法已经见怪不怪了,现在看到什么题目我第一反应都是遍历。。
果然这题也是可以的

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

你可能感兴趣的:(LeetCode,数据结构)