Leetcode 454. 四数相加 II
题目链接: 四数相加 II
Solution:
- 哈希表
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int>map;
for(auto u: nums1) {
for(auto v: nums2)
map[u+v]++;
}
int res = 0;
for(auto u: nums3) {
for(auto v: nums4)
if(map.count(-u-v))
res += map[-u-v];
}
return res;
}
};
Leetcode 383. 赎金信
题目链接:赎金信
Solution:
- 哈希法
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int hash[26] = {0};
for(auto ch : magazine)
hash[ch - 'a']++;
for(auto ch : ransomNote)
hash[ch - 'a']--;
for(int i = 0; i < 26; i++) {
if(hash[i] < 0)
return false;
}
return true;
}
};
Leetcode 15. 三数之和
题目链接:三数之和
Solution:
- 哈希法
class Solution {
public:
int get_sum(int n) {
int sum = 0;
while(n) {
sum += (n%10)*(n%10);
n /= 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int>set;
int sum = 0;
while(1) {
sum = get_sum(n);
if(sum == 1)
return true;
if(set.find(sum) != set.end()) {
return false;
} else {
set.insert(sum);
}
n = sum;
}
}
};
Leetcode 18 四数之和
题目链接:四数之和
Solution:
- 双指针
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>>res;
sort(nums.begin(), nums.end());
int left, right;
for(int k = 0; k < nums.size(); k++) {
if(nums[k] > target && nums[k] >= 0)
break;
if(k > 0 && nums[k-1] == nums[k])
continue;
for(int i = k+1; i < nums.size(); i++) {
if(nums[i] + nums[k] > target && nums[i] + nums[k] >= 0)
break;
if(i > k+1 && nums[i-1] == nums[i])
continue;
left = i + 1;
right = nums.size() - 1;
while(right > left) {
if((long)nums[k] + nums[i] + nums[left] + nums[right] > target)
right--;
else if((long)nums[k] + nums[i] + nums[left] + nums[right] < target)
left++;
else {
res.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]});
while(right > left && nums[right] == nums[right-1])
right--;
while(right > left && nums[left] == nums[left+1])
left++;
left++;
right--;
}
}
}
}
return res;
}
};