一 最大子数组和
数组链接:力扣:53.最大子数组和
示例: 输入:nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
输出:6
解释:连续子数组[4, -1, 2, 1]的和最大,为6。
解题思想:
贪心算法:在遍历数组时,在进行累加连续和的过程中,如果连续和是一个负数,那么累加后面的数会导致后面的数变小。例如:“-1+2”,这里-1只会让2变得更小,而不会变大。所以我们与其使用这个-1,不如重新开始,将 “2” 作为连续和的新起点。由此推断,我们可以得知,如果当前连续和是负数的情况下,就抛弃这个连续和,直接选择下一个数作为新的起点开始遍历,因为负数只会拖累我们的总和。
注意:这里强调的是连续和是负数的时候,我们就立刻抛弃这个连续和,没说是遇到负数我们就立刻抛弃,两者有区别。
代码:
class Solution {
public:int maxSubArray(vector<int>& nums) {int max=INT_MIN;int sum=0;for(int i=0;i<nums.size();i++){sum+=nums[i];max=sum>max?sum:max;sum=sum>0?sum:0;}return max;}
};
二 寻找目标值-二维数组
题目链接:力扣:LCR121.寻找目标值-二维数组
m*n 的二维数组 plants 记录了园林景观的植物排布情况,具有以下特性:
● 每行中,每棵植物的右侧相邻植物不矮于该植物;
● 每列中,每棵植物的下侧相邻植物不矮于该植物。
请判断 plants 中是否存在目标高度值 target。
示例:
输入:plants = [[2, 3, 6, 8], [4, 5, 8, 9], [5, 9, 10, 12]],target = 10
输出:true
解题思想:
由于给定的二维数组具备每行从左到右递增,每列从上到下递增的特点,
当访问到一个元素时,可以排除数组中的部分元素。从二维数组的右上角开始查找。如果当前元素大于目标值,则移到左边一列。若当前元素等于目标值,则返回true。如果当前元素大于目标值,则移到左边一列。如果当前元素小于目标值,则移到下边一行。
证明:如果当前元素大于目标值,说明当前元素的下边的所有元素都一定大于目标值,因此往下查找不可能找到目标值,往左查找可能找到目标值。如果当前元素小于目标值,说明当前元素的左边的所有元素都一定小于目标值,因此往左查找不可能找到目标值,往下查找可能找到目标值。
代码:
class Solution {
public:bool findTargetIn2DPlants(vector<vector<int>>& plants, int target) {if(plants.size()==0) return false;int m=plants.size();//二维数组的行数int n=plants[0].size();//二维数组的列数int row=0,col=n-1;while(col>=0&&row<m){if(plants[row][col]<target) row++;else if(plants[row][col]>target) col--;else return true;}return false;}
};
祝大家生活愉快。