1. 增量元素之间的最大差值
方法一:双循环
就是两个for循环,控制i下标在j下标之前就可以。
class Solution
{
public:
int maximumDifference(vector<int>& nums)
{
int n = nums.size();
int maxAns = INT_MIN;
for(int j = 1; j < n; j++)
{
for(int i = 0; i < j; i++)
{
maxAns = max(maxAns, nums[j] - nums[i]);
}
}
if(maxAns <=0 )
return -1;
return maxAns;
}
};
方法二:单向遍历
这个方法关键就是不断比较维护一个最小数,然后再用一个变量记录当前遍历到的数和之前记录的最小数作差不断比较
class Solution
{
public:
int maximumDifference(vector<int>& nums)
{
int maxAns = INT_MIN;
int minNum = INT_MAX;
int n = nums.size();
for(int num : nums)
{
maxAns = max(maxAns, num - minNum);
minNum = min(minNum, num);
}
if(maxAns <= 0)
maxAns = -1;
return maxAns;
}
};
2.网格游戏
方法:前缀和加后缀和
红色是第一个机器人的路径,以我图片为例,第一个机器人在第1列向下就导致,第二个机器人的路径和就是第0行第1列之后的和或者第1行第1列之前的那块路径和。同理可得咱们遍历第一个机器人在第0行哪列向下后的所有情况,如果第一个机器人在第0行第i列向下那么第二个机器人之和就是第0行第i列之后的路径和或者第1行第i列之前的路径和。
此时有一点注意,我这里没有遍历第一个机器人在第0行第0列就向下,所以我默认ans等于第0行第0列之和的路径和
在注意一点第一个机器人的走法是让第二个机器人走的最少
class Solution
{
public:
long long gridGame(vector<vector<int>>& grid)
{
int col = grid[0].size(); //遍历列就行了
long long hou = 0; //第一行的后缀和
long long qian = 0; //第二行的前缀和
for(int i = 1; i < col; ++i)
hou += grid[0][i]; //第一个机器人肯定从左上角出发肯定是0不用想
long long ans = hou; //第一个机器人从第0列就向下,此时用ans直接记录第一行的后缀和
for(int i = 1; i < col; ++i)
{
qian += grid[1][i-1];
hou -= grid[0][i];
ans = min(ans, max(qian, hou));
}
return ans;
}
};