242.有效的字母异位词
题目链接: 242.有效的字母异位词
思路
此题就是比较两个字符串里的字母是否完全一样,可以用排序的方法,排序后两个字符串完全一样,就是字母异位词,但是排序的算法时间复杂度为O(n log n),想到查找元素是否存在,应该首先考虑哈希表。 当然此题也可以用数组来简单表示哈希表,构建一个长度为26的整数数组,数组下标为s[i]-'a' ,然后遍历s,将对应下标的元素++,这样利用数字可以很好地查找操作。 首先先判断两个字符串长度是否相等,不相等肯定不是字母异位词。
代码
1. 哈希表
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.size() != t.size()) {
return false;
}
unordered_map<char, int> sMap;
for (int i = 0; i < s.size(); i++) {
sMap[s[i]]++;
}
for (int i = 0; i< t.size(); i++) {
sMap[t[i]]--;
}
for (auto ite = sMap.begin(); ite != sMap.end(); ite++) {
if (ite->second != 0) {
return false;
}
}
return true;
}
};
2. 数组
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0};
for (char ch : s) {
record[ch-'a']++;
}
for (char ch : t) {
record[ch-'a']--;
}
for (int n : record) {
if (n != 0 ) {
return false;
}
}
return true;
}
};
349. 两个数组的交集
题目链接: 349. 两个数组的交集
思路
因为输出结果是唯一的,所以用set,首先设置一个result_set 用来存放交集元素,再设置一个set存放nums1的元素,遍历nums2,然后nums2的元素在nums1的set集合中出现,就将其放入resul_set。
代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for (int num : nums2) {
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
- 此题之前做过,现在有思路但是具体细节还得看一遍答案代码才能想起来。
202. 快乐数
题目链接: 202. 快乐数
思路
注意无限循环这个字眼,也就是说如果平方和之前出现过,就是循环了,这个数就不是快乐数。那么查找之前出想过的数就要用到哈希表了,所以将每一次的和放入一个set里,然后后面的和去set查找,如果存在,就返回false ,如果不存在就将这个和继续插入set。 注意: 由于要对每一位拆分,所以拆分求和的算法也要注意。
代码
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> set;
while (1) {
int sum = getSum(n);
if (sum == 1) {
return true;
}
if (set.find(sum) != set.end()) {
return false;
} else {
set.insert(sum);
}
n = sum;
}
}
};
1. 两数之和
题目链接:1. 两数之和
思路
此题为力扣第一题,看似简单,其实也有点难度,首先想的就是暴力法,但是时间效率不高,所以也可以采用哈希法,用一个map容器,key为数组元素,value为数组下标,遍历数组,去找target-nums[i]在map容器中是否存在,如果存在返回对应的value值。
代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
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 {};
}
};
-此题做过多遍,再次做虽然有思路但是具体的代码还是没太想出,所以代码细节也很重要。
|