10.27算法(哈希表)

3.1有效字母的异位词

class Solution {

public:

  bool isAnagram(string s, string t) {

​    int record[26] = {0};//创建哈希表,数组

​    int i = 0;

​    for(;i<s.size();i++)

​      record[s[i]-'a']++;//字符串s中ACSII直接减去a的ASCII可以得到本身的ASCII。就是找到对应的数组下标然后加一

​    for(i=0;i<t.size();i++)

​      record[t[i]-'a']--;//同样的找到数组下标减一

​    for(i=0;i<26;i++)

​      if(record[i]!=0)//如果遍历整个数组存在任意数值都需要判错

​        return false;

​    return true;

  }

};

3.2数组的交集

for(int num : nums)

表示迭代器遍历,对于数组来说相当于

for(int i = 0;i<nums2.length;i++){
    int num = nums2[i];
}

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());//begin代表首位,end代表末尾的后一个位置

​    for(int num : nums2){

​      if(nums_set.find(num)!=nums_set.end())//nums_set.end()应该是空的,因为它指的是最后元素的后一个位置

​        result_set.insert(num);

​    }

​    return vector<int>(result_set.begin(),result_set.end());//重新将哈希表转换成数组输出

  }

};

3.3快乐数

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。


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;//使用unorde可以有效的自动删除重复的元素,同时

​      while(1){//不断的循环

​        int sum = getSum(n);

​        if(sum==1)

​          return true;

​        if(set.find(sum)!=set.end())//如果找到重复的sum表示这个数肯定不是快乐数,因为一直在以某个周期不断的循环

​          return false;

​        else

​          set.insert(sum);//不重复则纳入set哈希表

​        n = sum;//n元素重新赋值为当前的sum值

​      }

​    }

};

3.4两数之和

auto的原理就是根据后面的值,来自己推测前面的类型是什么。

auto的作用就是为了简化变量初始化,如果这个变量有一个很长很长的初始化类型,就可以用auto代替。

map:{key关键字:value下标}

class Solution {

public:

  vector<int> twoSum(vector<int>& nums, int target) {

​    std::unordered_map<int,int> map;//创建不需要排好顺序的map表

​    for(int i = 0;i<nums.size();i++){

​      auto iter = map.find(target-nums[i]);//iter来保存目标值-当前遍历值=需要匹配的值

​      if(iter != map.end())//如果此时在map表中找到了匹配的值

​        return {iter->second,i};//返回iter中的value和当前下标

​      else

​        map.insert(pair<int,int>(nums[i],i));否则纳入map表中

​    }

​    return {};

  }

};
posted @ 2023-10-27 20:06  Ref-rain-  阅读(10)  评论(0)    收藏  举报