438.找到字符串中所有字母异位词
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
1.滑动窗口:找到s和t的长度,然后开始遍历s,首先判断第一个i=0的状态,然后每次循环把上一个状态减去,判断是否为异位词,把下标存入
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int sLen = s.size(), pLen = p.size();
if(sLen < pLen) {
return vector<int>();
}
vector<int> ans;
vector<int> sCount(26);
vector<int> pCount(26);
for(int i = 0; i < pLen; i++) {
sCount[s[i] - 'a']++;
pCount[p[i] - 'a']++;
}
if(sCount == pCount) {
ans.emplace_back(0);
}
for(int i = 0; i < sLen - pLen; i++) {
sCount[s[i] - 'a']--;
sCount[s[i + pLen] - 'a']++;
if(sCount == pCount) {
ans.emplace_back(i + 1);
}
}
return ans;
}
};
350.两个数组的交集II
给你两个整数数组 nums1
和 nums2
,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
1.哈希表:首先遍历第一个数组,并在哈希表中记录第一个数组中的每个数字以及对应出现的次数,然后遍历第二个数组,如果在哈希表中存在这个数组,则将该数字添加到答案,并减少哈希表中该数字出现的次数
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
// 处理nums1 > nums2 的情况
if(nums1.size() > nums2.size()) {
return intersect(nums2, nums1);
}
unordered_map<int, int> mp;
for(int num : nums1) {
mp[num]++;
}
vector<int> res;
for(int num : nums2) {
if(mp.count(num)) {
res.push_back(num);
mp[num]--;
if(mp[num] == 0) mp.erase(num);
}
}
return res;
}
};
2.排序+双指针:初始时,两个指针分别指向两个数组头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,将该数字添加到答案
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int len1 = nums1.size(), len2 = nums2.size();
vector<int> res;
int index1 = 0, index2 = 0;
while(index1 < len1 && index2 < len2) {
if(nums1[index1] < nums2[index2]) {
index1++;
} else if (nums1[index1] > nums2[index2]) {
index2++;
} else {
res.push_back(nums1[index1]);
index1++;
index2++;
}
}
return res;
}
};
202.快乐数
1.哈希表用来判断是否重复出现,别的就是数学问题
class Solution {
public:
int getSum(int n) {
int sum = 0;
while(n) {
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> st;
while(1) {
int sum = getSum(n);
if(sum == 1) return true;
// 如果这个sum出现过 直接返回false
if(st.find(sum) != st.end()) {
return false;
} else {
st.insert(sum);
}
n = sum;
}
}
};
1.两数之和
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
1.暴力枚举
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size();
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
if(nums[i] + nums[j] == target) {
return {i, j};
}
}
}
return {};
}
};
2.哈希表:key-value结构的unordered_map,key对应数值,value对应下标,如果没找到,将其存入哈希表
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std :: 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 {};
}
};
这几天有点懈怠了,太疲惫了!
调整自己状态,找自己问题!
加油
!!!