454.四数相加II
暴力解法(超时)
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> nums4_map;
int result = 0;
//for(int m = 0;m<nums4.size();m++)
//{
// nums4_map.insert(pair<int,int>(nums4[m],m));
//}
for(int i = 0;i<nums1.size();i++)
{ int sum=nums1[i];
for(int j = 0;j<nums2.size();j++)
{
sum = nums1[i];
sum+=nums2[j];
for(int k = 0;k<nums3.size();k++)
{
sum = nums1[i]+nums2[j];
sum+=nums3[k];
for(int l = 0;l<nums4.size();l++)
{
if(nums4[l]==0-sum)
{
result++;
}
}
}
}
}
return result;
}
随想录解法
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> ab_map;
int result = 0;
for(int a:nums1)
{
for(int b:nums2)
{
int ab = a;
ab+=b;
ab_map[ab]++;
}
}
for(int c:nums3)
{
for(int d:nums4)
{
int cd = c;
cd +=d;
auto count = ab_map.find(-cd);
if(count!=ab_map.end())
{
result+=ab_map[-cd];
}
}
}
return result;
}
- 感觉随想录解法单纯为了减少时间复杂度
383. 赎金信
map代码(自写)
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char,int>umap;
for(char maga : magazine)
{
umap[maga]++;
}
for(char ran:ransomNote)
{
auto res = umap.find(ran);
if(res != umap.end())
{
if(umap[ran]==0)
{
return false;
}
else umap[ran]--;
}
else
return false;
}
return true;
}
随想录代码
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26] = {0};
//add
if (ransomNote.size() > magazine.size()) {
return false;
}
for (int i = 0; i < magazine.length(); i++) {
// 通过record数据记录 magazine里各个字符出现次数
record[magazine[i]-'a'] ++;
}
for (int j = 0; j < ransomNote.length(); j++) {
// 遍历ransomNote,在record里对应的字符个数做--操作
record[ransomNote[j]-'a']--;
// 如果小于零说明ransomNote里出现的字符,magazine没有
if(record[ransomNote[j]-'a'] < 0) {
return false;
}
}
return true;
}
};
- 虽然红黑树我还不太能用的明白。
15. 三数之和
自己只能想出来暴力解法,提交超时,看代码随想录双指针法
代码
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
if(nums[i]>0)
{
return result;
}
if(i>0&&nums[i]==nums[i-1])
{
continue;
}
int left = i+1;
int right = nums.size()-1;
while(right>left)
{
if(nums[i]+nums[left]+nums[right]>0) right--;
else if(nums[i]+nums[left]+nums[right]<0) left++;
else{
result.push_back(vector<int>{nums[i],nums[left],nums[right]});
while(right>left&&nums[right]==nums[right-1]) right--;
while(right>left&&nums[left]==nums[left+1]) left++;
right--;
left++;
}
}
}
return result;
}
*抄了很多遍终于理解了
18. 四数之和
- 感觉和三数之和一样的
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
if(nums[i] > target && nums[i] >=0)
{
break;
}
if(i>0&&nums[i] == nums[i-1])
{
continue;
}//这个好像不需要去重
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]>target&& nums[i]+nums[j]>=0)//此处大于0为了防止-4+-3=-7,target=-8情况出现
{
break;
}
if(j>i+1&&nums[j] == nums[j-1])
{
continue;
}
int left = j+1;
int right = nums.size()-1;
while(left < right)
{
if((long)nums[i]+ nums[j]+nums[left]+nums[right]>target)right--;
else if((long)nums[i]+ nums[j]+nums[left]+nums[right]<target)left++;
else{
result.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]});
while(left < right&& nums[right]==nums[right-1]) right--;
while(left < right&& nums[left]==nums[left+1]) left++;
right--;
left++;
}
}
}
}
return result;
}
};
*难点就寻找边界,就是去重各种问题,这个问题最难就是去重