目录
53.最大子数组和
示例 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
csub=max(a[i],csub+a[i]);//a[i]
class Solution {
public:
int maxSubArray(vector<int>& a) {
int csub=a[0];
int res=a[0];
for(int i=1;i<a.size();i++)
{
csub=max(a[i],csub+a[i]);
res=max(csub,res);
}
return res;
}
};
560.和为K的子数组
class Solution {
public:
int subarraySum(vector<int>& a, int x) {
int sum=0,res=0;
unordered_map<int,int> he;//统计前缀和出现个数
he[0]++;
for(int num:a)
{
sum+=num;
if(he.find(sum-x)!=he.end())
{
res+=he[sum-x];
}
he[sum]++;
}
return res;
}
};
1.两数之和
class Solution {
public:
vector<int> twoSum(vector<int>& a, int x) {
unordered_map<int,int> ump;
int n=a.size();
for(int i=0;i<n;i++)
{
auto pos=ump.find(x-a[i]);
if(pos!=ump.end())
return {pos->second,i};
else
ump[a[i]] = i;
//ump.insert(pair<int,int>(a[i],i));
}
return {};
}
};
15.三数之和
class Solution
{
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> res;
int n=nums.size();
sort(nums.begin(),nums.end());
int i,l,r;
for(i=0; i<n-2; i++)
{
if(i>0&&nums[i]==nums[i-1]) continue;
l=i+1,r=n-1;
while(l<r)
{
int sum=nums[i]+nums[l]+nums[r];
if(sum==0)
{
res.push_back({nums[i],nums[l],nums[r]});
while(l<r&&nums[l]==nums[l+1]) l++;
while(l<r&&nums[r]==nums[r-1]) r--;
l++;
r--;
}
else if(sum>0) r--;
else l++;
}
}
return res;
}
};