242. 有效的字母异位词
hash表记录+1查找-1
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> hash(26,0);
for(int i=0;i<s.size();i++){
hash[s[i]-'a']++;
}
for(int i=0;i<t.size();i++){
hash[t[i]-'a']--;
}
for(int i=0;i<26;i++){
if(hash[i]!=0)
{
return false;
}
}
return true;
}
};
349. 两个数组的交集
因为数据量减少,可以用数组
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> hash(1001,0);
vector<int> re;
for(int i=0;i<nums1.size();i++)
{
hash[nums1[i]]=1;
}
for(int i=0;i<nums2.size();i++)
{
if(hash[nums2[i]]==1)
{
hash[nums2[i]]=2;
}
}
for(int i=0;i<1001;i++)
{
if(hash[i]==2)
{
re.push_back(i);
}
}
return re;
}
};
使用unordered_set建立hash
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for (int num : nums2) {
// 发现nums2的元素 在nums_set里又出现过
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
使用数组和unordered_set
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
int hash[1005] = {0}; // 默认数值为0
for (int num : nums1) { // nums1中出现的字母在hash数组中做记录
hash[num] = 1;
}
for (int num : nums2) { // nums2中出现话,result记录
if (hash[num] == 1) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
202. 快乐数
目标是找循环
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;
}
//如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
if(set.find(sum)!=set.end()){
return false;
}else{
set.insert(sum);
}
n=sum;
}
}
};
1. 两数之和
暴力,遍历所有和
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> b(2,-1);
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]==target)
{
b[0]=i;
b[1]=j;
return b;
}
}
}
return b;
}
};
两次遍历hash
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;
vector<int> b(2,-1);
for(int i=0;i<nums.size();i++)
{
a.insert(map<int,int>::value_type(nums[i],i));
}
for(int i=0;i<nums.size();i++)
{
if(a.count(target-nums[i])>0&&(a[target-nums[i]]!=i))
{
b[0]=i;
b[1]=a[target-nums[i]];
break;
}
}
return b;
}
};
单循环hash
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;
vector<int> b(2,-1);
for(int i=0;i<nums.size();i++)
{
if(a.count(target-nums[i])>0)
{
b[0]=a[target-nums[i]];
b[1]=i;
break;
}
a[nums[i]]=i;
}
return b;
}
};