class Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0};
for(int i=0;i<s.size();i++){
record[s[i]-'a']++;
}
for(int i=0;i<t.size();i++){
record[t[i]-'a']--;
}
for(int i=0;i<26;i++){
if(record[i]!=0){
return false;
}
}
return true;
}
};
LC 349 两个数组的交集 (unordered_set)
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//set
unordered_set<int> res;
unordered_set<int> num_set(nums1.begin(), nums1.end());
for(int num: nums2){
if(num_set.find(num) != num_set.end()){
res.insert(num);
}
}
return vector<int>(res.begin(), res.end());
}
};
LC 202 快乐数
class Solution {
public:
int calSum(int n){
int sum=0;
while(n>0){
sum += (n%10)*(n%10);
n /= 10;
}
return n;
}
bool isHappy(int n) {
//判断重复出现-哈希表
unordered_set<int> res;
while(true){
n = calSum(n);
if(n==1) return true;
if(res.find(n) == res.end()){
res.insert(n);
}else{
return false;
}
}
return false;
}
};
LC 1 两数之和
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// 虽然数组有重复元素,但只要放一个进map
unordered_map <int,int> map;
for(int i=0;i<nums.size();i++){
auto iter = map.find(target-nums[i]);
if(iter!=map.end()){
return {iter->second, i};
}
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};
LC 454 四数相加 II
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
//四个分开的数组,两个两个来
unordered_map<int,int> uomap;
for(int a: nums1){
for(int b: nums2){
uomap[a+b]++;
}
}
int cnt =0;
for(int c: nums3){
for(int d: nums4){
if(uomap.find(-c-d)!=uomap.end()){
cnt += uomap[-c-d];
}
}
}
return cnt;
}
};
LC 383 赎金信
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[i]-'a'] ++;
}
for (int j = 0; j < ransomNote.length(); j++) {
record[ransomNote[j]-'a']--;
if(record[ransomNote[j]-'a'] < 0) {
return false;
}
}
return true;
}
};
LC 15 三数之和
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
//先排序
sort(nums.begin(), nums.end());
for(int i=0;i<nums.size();i++){
if(nums[i]>0){
return res;
}
if(i>0 && nums[i] == nums[i-1]){
continue;
}
int left = i+1;
int right = nums.size() - 1;
while(left<right){
if(nums[left] + nums[right] < - nums[i]){
left++;
}else if(nums[left] + nums[right] > -nums[i]){
right--;
}else{
res.push_back(vector<int>{nums[i], nums[left], nums[right]});
// 不要漏掉left<right
while((left<right)&&(nums[right]==nums[right-1])) right--;
while((left<right)&&(nums[left]==nums[left+1])) left++;
right--;
left++;
}
}
}
return res;
}
};
LC 18 四数之和
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
for(int i=0; i<nums.size(); i++){
if(nums[i] > target && target>=0){
return res;
}
if(i>0 && nums[i]==nums[i-1]){
continue;
}
for(int j=i+1; j<nums.size()-1; j++){
//再次剪枝!!
if(nums[i]+nums[j] > target && target>=0){
break;
}
// j>i+1
if(j>i+1 && nums[j]==nums[j-1]){
continue;
}
int left = j + 1;
int right = nums.size() - 1;
while (right > left) {
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 {
res.push_back(vector<int>{nums[i], nums[j], 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 res;
}
};